HDU4725 SPFA (最短路+层级建图)
问题描述
这是一个非常容易的问题,你的任务只是计算el camino mas corto en un grafico,而且只是单独干草阙cambiar un poco el algoritmo。如果你不理解这一段的话,那就继续吧。
Nya图是具有“层”的无向图。图中的每个节点都属于一个层,总共有N个节点。
您可以从层x中的任何节点移动到层x + 1中的任何节点,成本为C,因为道路是双向的,从层x + 1移动到层x也允许具有相同的成本。
此外,还有M个额外边缘,每个边缘连接一对节点u和v,成本为w。
帮助我们计算从节点1到节点N的最短路径。
输入
第一行的数字为T(T <= 20),表示测试用例的数量。
对于每个测试用例,第一行有三个数字N,M(0 <= N,M <= 105)和C(1 <= C <= 103),这是节点数,额外边数和成本在相邻层之间移动。
第二行有N个数字li(1 <= li <= N),这是第i个节点所属的层。
然后得到N行,每行有3个数字,u,v(1 <= u,v <= N,u <> v)和w(1 <= w <= 104),这意味着有一条额外的边,连接一个节点u和v对,成本为w。
产量
对于测试用例X,首先输出“Case #X:”,然后输出从节点1移动到节点N的最小成本。
如果没有解决方案,则输出-1。
样本输入
2
3 3 3
1 3 2
1 2 1
2 3 1
1 3 3
3 3 3
1 3 2
1 2 2
2 3 2
1 3 4
样本输出
案例#1:2
案例#2:3
如果是每个点向比他层级小一或大一的点连边的话,复杂度为n××2,所以说每层抽象一个点,每层的抽象出来的点先此层的点连边,以此就避免的枚举每个点的层数
坑点: 同层之间的点不连通
1 #include <cstdio> 2 #include <cmath> 3 #include <cstring> 4 #include <cstdlib> 5 #include <climits> 6 #include <ctype.h> 7 #include <queue> 8 #include <stack> 9 #include <vector> 10 #include <deque> 11 #include <set> 12 #include <map> 13 #include <iostream> 14 #include <algorithm> 15 using namespace std; 16 #define pi acos(-1.0) 17 #define INF 0x3f3f3f3f 18 #define N 200017 19 int n, m, k, c; 20 int Edgehead[N], dis[N]; 21 int vv[N], lay[N]; 22 struct 23 { 24 int v,w,next; 25 } Edge[20*N]; 26 bool vis[N]; 27 int cont[N]; 28 29 void init() 30 { 31 memset(Edgehead,0,sizeof(Edgehead)); 32 memset(vv,0,sizeof(vv)); 33 } 34 35 void Addedge(int u,int v,int w) 36 { 37 Edge[k].next = Edgehead[u]; 38 Edge[k].w = w; 39 Edge[k].v = v; 40 Edgehead[u] = k++; 41 } 42 int SPFA( int start) 43 { 44 queue<int>Q; 45 while(!Q.empty()) Q.pop(); 46 for(int i = 1 ; i <= N ; i++ ) 47 dis[i] = INF; 48 dis[start] = 0; 49 //++cont[start]; 50 memset(vis,false,sizeof(vis)); 51 vis[start] = 1; 52 Q.push(start); 53 while(!Q.empty())//直到队列为空 54 { 55 int u = Q.front(); 56 Q.pop(); 57 vis[u] = false; 58 for(int i = Edgehead[u] ; i!=-1 ; i = Edge[i].next)//注意 59 { 60 int v = Edge[i].v; 61 int w = Edge[i].w; 62 if(dis[v] > dis[u] + w) 63 { 64 dis[v] = dis[u]+w; 65 if( !vis[v] )//防止出现环,也就是进队列重复了 66 { 67 Q.push(v); 68 vis[v] = true; 69 } 70 //if(++cont[v] > n)//有负环 71 // return -1; 72 } 73 } 74 } 75 return dis[n]; 76 } 77 int main() 78 { 79 int u, v, w; 80 int t; 81 int cas = 0; 82 scanf("%d",&t); 83 while(t--) 84 { 85 init(); 86 scanf("%d%d%d",&n,&m,&c); 87 k = 1; 88 memset(Edgehead,-1,sizeof(Edgehead)); 89 90 for(int i = 1; i <= n; i++) 91 { 92 scanf("%d",&u);//i 在第u层 93 lay[i] = u; 94 vv[u] = 1; 95 } 96 97 for(int i = 1; i < n; i++) 98 { 99 if(vv[i] && vv[i+1]) //两层都出现过点相邻层才建边 100 { 101 Addedge(n+i,n+i+1,c); 102 Addedge(n+i+1,n+i,c); 103 } 104 } 105 106 for(int i = 1; i <= n; i++) //层到点建边 点到相邻层建边 107 { 108 Addedge(n+lay[i],i,0); 109 110 111 if(lay[i] > 1) 112 Addedge(i,n+lay[i]-1,c); 113 if(lay[i] < n) 114 Addedge(i,n+lay[i]+1,c); 115 116 117 } 118 119 for(int i = 1 ; i <= m ; i++ ) 120 { 121 scanf("%d%d%d",&u,&v,&w); 122 Addedge(u,v,w);//双向链表 123 Addedge(v,u,w);//双向链表 124 } 125 int s = SPFA(1);//从点1开始寻找最短路 126 if(s == INF) 127 { 128 s = -1; 129 } 130 printf("Case #%d: %d\n",++cas,s); 131 } 132 return 0; 133 }
转载于:https://www.cnblogs.com/zhangbuang/p/10289470.html
HDU4725 SPFA (最短路+层级建图)相关推荐
- HDU 4725 层级最短路 思维建图 邻接表 堆优化迪杰斯特拉 真的难想 区域网络赛真题
题目 题解思路 知道是最短路,怎么建图呢? 一开始想到每层来一个超级源点,但是方向不知道怎么确定,用双向边果然WA了(如果是双向边,那一层的都会变成0费连通了 ). 翻了翻 大佬的博客 大佬定义了一种 ...
- 小雨坐地铁--[最短路分层建图+虚点]
也是第一次接触这种分层建图的最短路 思路:由题目我们可以知道某些站点是可以连接好几条地铁线路的,那么对于每条地铁线路我们可以把他当成一幅图来算.当然图是个无向图,所以要加两次边. add(i*n+x, ...
- 算法提高课-图论-单源最短路的建图方式-AcWing 920. 最优乘车:bfs求最短路、建图
题目分析 来源:acwing 分析: 本题难在抽象建图上,这里采用的建图方式是:同一条公交线路上,前面的站点都可以连一条有向边到其后面的站点,且边权都为1. 由于边权都是1,可以用bfs来求最短路. ...
- CodeForces - 1529F It‘s a bird! No, it‘s a plane! No, it‘s AaParsa!(最短路+思维建图)
题目链接:点击查看 题目大意:给出 nnn 个点(从 000 开始编号)和 mmm 条边的有向带权图,不过 mmm 条边是动态的,经过 ttt 秒后,第 iii 条边就从 ai−>bi,cia_ ...
- Invitation Cards POJ - 1511 SPFA(dijkstra+反向建图+邻接表(下标过大)+输入输出用stdio(iostream超时))
题目大意: 有编号1-P的站点, 有Q条公交车路线,公交车路线只从一个起点站直接 到达终点站,是单向的,每条路线有它自己的车费.有P个人早上从1出发 ,他们要到达每一个公交站点, 然后到了晚上再返回点 ...
- 单源最短路的建图方式(Dijkstra)
由于是复习,所以不会解释太多. 主要为Dijkstra的堆优化板子和朴素版(看数据范围) 再次看看时间复杂度[ n 为点数,m 为边数 ]:朴素版:O(),堆优化版:O( (n+m)logm ). 目 ...
- 算法提高课-图论-单源最短路的建图方式-AcWing 903. 昂贵的聘礼:建图巧妙、dijkstra、考虑等级
题目分析 来源:acwing 由于终点是1号节点,建立虚拟节点S,如下建图(根据样例画图).S出发和每个点直连的边权代表直接买该物品花的金币数:而由S到1的任意一条通路,边权之和就是花费的金币数.所以 ...
- CodeForces - 1422D Returning Home(最短路+思维建图)
题目链接:点击查看 题目大意:给出一个 n * n 的二维平面,现在要从点 ( sx , sy ) 到达点 ( fx , fy ),在平面上有 m 个传送门,共有两次操作: 向上.下.左.右移动一个单 ...
- 【牛客 - 157E】青蛙(floyd最短路,建图)
题干: 链接:https://ac.nowcoder.com/acm/contest/157/E 来源:牛客网 题目描述 有一只可爱的老青蛙,在路的另一端发现了一个黑的东西,想过去一探究竟.于是便开始 ...
最新文章
- 2021 Facebook 博士奖研金名单出炉:13位华人学者获选
- 致敬YOLO!华科提出YOLOS:基于视觉Transformer的目标检测
- 类模板与运算符重载(一个简单的例子)
- android 心跳效果动画,Android实现心跳的效果
- Beginning iCloud in iOS 5 Tutorial Part 2(转载)
- Memchache 总结
- linux编译内核的步骤
- python中用于绘制各种图形的区域称作_Python--matplotlib绘图可视化知识点整理(示例代码)...
- geitee仓库项目拉到(克隆到)本地
- shell脚本:一次读取文件的一行,并输出
- BIM模型文件下载——某体育馆项目Revit模型
- TiledMap 使用
- 民间计算机网络高手,高手在民间!牛人用Excel创作的惊人画作
- 游戏跟计算机不兼容,端游不兼容怎么解决
- amd玄冰400怎么拆图解_给老电脑降降温(把AMD原装散热器换成玄冰400)过程体验...
- OCP-1Z0-051 补充题库 第35题 LONG类型
- linux安装liinuxrar教程,linux操作系统下RAR的安装和使用
- 【毕设】基于HTML的零食商城网站大前端开发设计(含文档)
- Jquery实现表格动态增加一行,删除一行(最简洁的代码实现)
- APT(Advanced Packaging Tool)