[HDU 1535]Invitation Cards[SPFA反向思维]
题意: (欧洲人自己写的题面就是不一样啊...各种吐槽...果断还是看晕了)
有向图, 有个源叫CCS, 求从CCS到其他所有点的最短路之和, 以及从其他所有点到CCS的最短路之和.
思路:
返回的时候是多个源,但是因为终点只有一个,所以把所有边反向之后, 再SPFA一次源即可.
- #include<cstdio>
- #include<vector>
- #include<queue>
- const int MAXN=1000000+10;
- typedef long long ll;
- const ll inf=1e60;
- using namespace std;
- struct Node{
- int v,w;
- };
- vector<Node>mp1[MAXN];//正向建图
- vector<Node>mp2[MAXN];//反向建图
- int n,m;
- ll cost[MAXN];
- void SPFA(int u,vector<Node>mp[]){
- for(int i=2;i<=n;i++)cost[i]=inf;
- cost[1]=0;
- queue<int>Q;
- Q.push(u);
- while(!Q.empty()){
- int u=Q.front();
- Q.pop();
- for(int i=0;i<mp[u].size();i++){
- int v=mp[u][i].v;
- int w=mp[u][i].w;
- if(cost[v]>cost[u]+w){
- cost[v]=cost[u]+w;
- Q.push(v);
- }
- }
- }
- }
- int main(){
- int _case;
- scanf("%d",&_case);
- while(_case--){
- scanf("%d%d",&n,&m);
- for(int i=1;i<=n;i++){
- mp1[i].clear();
- mp2[i].clear();
- }
- for(int i=1;i<=m;i++){
- int u,v,w;
- scanf("%d%d%d",&u,&v,&w);
- Node p1,p2;
- p1.v=u,p2.v=v,p1.w=p2.w=w;
- mp1[u].push_back(p2);
- mp2[v].push_back(p1);
- }
- SPFA(1,mp1);//正向求一次
- ll ans=0;
- for(int i=2;i<=n;i++){
- ans+=cost[i];
- }
- SPFA(1,mp2);//反向求一次
- for(int i=2;i<=n;i++){
- ans+=cost[i];
- }
- printf("%lld\n",ans);
- }
- return 0;
- }
自己敲一遍:
- #include <cstdio>
- #include <vector>
- #include <cstring>
- #include <queue>
- using namespace std;
- typedef long long ll;
- const int MAXN = 1e6+5;
- const ll INF = 0x3f3f3f3f3f3f3f3fll;
- typedef struct node
- {
- int v,w;
- node(){}
- node(int _v, int _w):v(_v),w(_w){}
- }node;
- int n,m;
- bool inq[MAXN];
- ll cost[MAXN];
- vector<node> g1[MAXN],g2[MAXN];
- ll SPFA(int op)
- {
- memset(cost,0x3f,sizeof(cost));
- memset(inq,false,sizeof(inq));
- cost[1] = 0;
- queue<int> q;
- q.push(1);
- inq[1] = true;
- while(!q.empty())
- {
- int now = q.front();q.pop();
- inq[now] = false;
- for(int i=0,v,w;i<((op==1)?g1[now].size():g2[now].size());i++)
- {
- if(op==1)
- {
- v = g1[now][i].v, w = g1[now][i].w;
- }
- else
- {
- v = g2[now][i].v, w = g2[now][i].w;
- }
- if(cost[v] > cost[now] + w)
- {
- cost[v] = cost[now] + w;
- if(!inq[v])
- {
- q.push(v);
- inq[v] = true;
- }
- }
- }
- }
- ll ret = 0;
- for(int i=2;i<=n;i++)
- ret += cost[i];
- return ret;
- }
- int main()
- {
- int T;
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d %d",&n,&m);
- for(int i=1;i<=n;i++)
- {
- g1[i].clear();
- g2[i].clear();
- }
- for(int i=0,u,v,w;i<m;i++)
- {
- scanf("%d %d %d",&u,&v,&w);
- g1[u].push_back(node(v,w));
- g2[v].push_back(node(u,w));
- }
- ll ans = 0;
- ans += SPFA(1);
- ans += SPFA(2);
- printf("%d\n",(int)ans);
- }
- }
[HDU 1535]Invitation Cards[SPFA反向思维]的更多相关文章
- hdu 1535 Invitation Cards(SPFA)
Invitation Cards Time Limit : 10000/5000ms (Java/Other) Memory Limit : 65536/65536K (Java/Other) T ...
- HDU 1535 Invitation Cards(SPFA,及其优化)
题意: 有编号1-P的站点, 有Q条公交车路线,公交车路线只从一个起点站直接到达终点站,是单向的,每条路线有它自己的车费. 有P个人早上从1出发,他们要到达每一个公交站点, 然后到了晚上再返回点1. ...
- HDU 1535 Invitation Cards(最短路 spfa)
题目链接: 传送门 Invitation Cards Time Limit: 5000MS Memory Limit: 32768 K Description In the age of te ...
- HDU - 1535 Invitation Cards 前向星SPFA
Invitation Cards In the age of television, not many people attend theater performances. Antique Come ...
- hdu 1535 Invitation Cards(spfa)
Invitation Cards Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- HDU 1535 Invitation Cards(逆向思维+邻接表+优先队列的Dijkstra算法)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1535 Problem Description In the age of television, n ...
- hdu 1535 Invitation Cards (最短路径)
Invitation Cards Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- HDU 1535 Invitation Cards (最短路)
题目链接 Problem Description In the age of television, not many people attend theater performances. Anti ...
- HDU 1535 Invitation Cards (POJ 1511)
两次SPFA. 求 来 和 回 的最短路之和. 用Dijkstra+邻接矩阵确实好写+方便交换.可是这个有1000000个点.矩阵开不了. d1[]为 1~N 的最短路. 将全部边的 邻点 交换. d ...
随机推荐
- rsync+sersync实现数据文件实时同步
一.简介 sersync是基于Inotify开发的,类似于Inotify-tools的工具: sersync可以记录下被监听目录中发生变化的(包括增加.删除.修改)具体某一个文件或某一个目录的名字: ...
- C#在局域网中连接Liunx上的MySql数据库
前期准备工作: 我所用的平台是VS2010和Ubuntu 14.04.3 LTS 一.由于MySql并没有集成在VS2010中所以要先安装MySQL Connector Net 6.9.8连接工具, ...
- Javscript中的null和undefined
1.null是JavaScript关键字,含义是“非对象”,它可以表示数字.字符串和对象是“无值”的. var x = null; typeof x ;//返回“object” var x=null, ...
- oracle 的服务器进程(PMON, SMON,CKPT,DBWn,LGWR,ARCn)
来着TOM的<oracle 编程艺术 9i,10g,11g> PMON PMON,进程监视.PMON主要有3个用途: 1,在进程非正常中断后,做清理工作.例如:dedicated serv ...
- PHP MAIL DEMO(程序代码直接发送邮件)
php代码 <?php // 收件人邮箱地址 $to = 'xxxxxx@qq.com'; // 邮件主题 $title = '测试邮件发送'; // 邮件内容 $msg = '这是一封测试邮件 ...
- VC中窗口ID,句柄,指针三者相互转换函数【转】
ID--HANDLE--HWND三者之间的互相转换id->句柄 hWnd = ::GetDlgItem(hParentWnd,id);id->指针 CWnd:: ...
- DOM 节点实例操作
涉及知识点包括节点的所有知识 目的: 自动为文档创建一个目录表 自动创建目录
- 【转】10 个迅速提升你 Git 水平的提示
最近我们推出了两个教程:熟悉Git的基本功能和让你在开发团队中熟练的使用Git . 我们所讨论的命令足够一个开发者在Git使用方面游刃有余.在这篇文章中,我们试图探索怎样有效的管理你的时间和充分的使用 ...
- HBase -ROOT-和.META.表结构(region定位原理)
在HBase中,大部分的操作都是在RegionServer完成的,Client端想要插入,删除,查询数据都需要先找到相应的RegionServer.什么叫相应的RegionServer?就是管理你要操 ...
- 双人贪吃蛇小游戏C++原创
大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang /*贪吃蛇*/ #include<stdio.h> #include<time. ...