问题描述
这是一个非常容易的问题,你的任务只是计算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 (最短路+层级建图)相关推荐

  1. HDU 4725 层级最短路 思维建图 邻接表 堆优化迪杰斯特拉 真的难想 区域网络赛真题

    题目 题解思路 知道是最短路,怎么建图呢? 一开始想到每层来一个超级源点,但是方向不知道怎么确定,用双向边果然WA了(如果是双向边,那一层的都会变成0费连通了 ). 翻了翻 大佬的博客 大佬定义了一种 ...

  2. 小雨坐地铁--[最短路分层建图+虚点]

    也是第一次接触这种分层建图的最短路 思路:由题目我们可以知道某些站点是可以连接好几条地铁线路的,那么对于每条地铁线路我们可以把他当成一幅图来算.当然图是个无向图,所以要加两次边. add(i*n+x, ...

  3. 算法提高课-图论-单源最短路的建图方式-AcWing 920. 最优乘车:bfs求最短路、建图

    题目分析 来源:acwing 分析: 本题难在抽象建图上,这里采用的建图方式是:同一条公交线路上,前面的站点都可以连一条有向边到其后面的站点,且边权都为1. 由于边权都是1,可以用bfs来求最短路. ...

  4. CodeForces - 1529F It‘s a bird! No, it‘s a plane! No, it‘s AaParsa!(最短路+思维建图)

    题目链接:点击查看 题目大意:给出 nnn 个点(从 000 开始编号)和 mmm 条边的有向带权图,不过 mmm 条边是动态的,经过 ttt 秒后,第 iii 条边就从 ai−>bi,cia_ ...

  5. Invitation Cards POJ - 1511 SPFA(dijkstra+反向建图+邻接表(下标过大)+输入输出用stdio(iostream超时))

    题目大意: 有编号1-P的站点, 有Q条公交车路线,公交车路线只从一个起点站直接 到达终点站,是单向的,每条路线有它自己的车费.有P个人早上从1出发 ,他们要到达每一个公交站点, 然后到了晚上再返回点 ...

  6. 单源最短路的建图方式(Dijkstra)

    由于是复习,所以不会解释太多. 主要为Dijkstra的堆优化板子和朴素版(看数据范围) 再次看看时间复杂度[ n 为点数,m 为边数 ]:朴素版:O(),堆优化版:O( (n+m)logm ). 目 ...

  7. 算法提高课-图论-单源最短路的建图方式-AcWing 903. 昂贵的聘礼:建图巧妙、dijkstra、考虑等级

    题目分析 来源:acwing 由于终点是1号节点,建立虚拟节点S,如下建图(根据样例画图).S出发和每个点直连的边权代表直接买该物品花的金币数:而由S到1的任意一条通路,边权之和就是花费的金币数.所以 ...

  8. CodeForces - 1422D Returning Home(最短路+思维建图)

    题目链接:点击查看 题目大意:给出一个 n * n 的二维平面,现在要从点 ( sx , sy ) 到达点 ( fx , fy ),在平面上有 m 个传送门,共有两次操作: 向上.下.左.右移动一个单 ...

  9. 【牛客 - 157E】青蛙(floyd最短路,建图)

    题干: 链接:https://ac.nowcoder.com/acm/contest/157/E 来源:牛客网 题目描述 有一只可爱的老青蛙,在路的另一端发现了一个黑的东西,想过去一探究竟.于是便开始 ...

最新文章

  1. 2021 Facebook 博士奖研金名单出炉:13位华人学者获选
  2. 致敬YOLO!华科提出YOLOS:基于视觉Transformer的目标检测
  3. 类模板与运算符重载(一个简单的例子)
  4. android 心跳效果动画,Android实现心跳的效果
  5. Beginning iCloud in iOS 5 Tutorial Part 2(转载)
  6. Memchache 总结
  7. linux编译内核的步骤
  8. python中用于绘制各种图形的区域称作_Python--matplotlib绘图可视化知识点整理(示例代码)...
  9. geitee仓库项目拉到(克隆到)本地
  10. shell脚本:一次读取文件的一行,并输出
  11. BIM模型文件下载——某体育馆项目Revit模型
  12. TiledMap 使用
  13. 民间计算机网络高手,高手在民间!牛人用Excel创作的惊人画作
  14. 游戏跟计算机不兼容,端游不兼容怎么解决
  15. amd玄冰400怎么拆图解_给老电脑降降温(把AMD原装散热器换成玄冰400)过程体验...
  16. OCP-1Z0-051 补充题库 第35题 LONG类型
  17. linux安装liinuxrar教程,linux操作系统下RAR的安装和使用
  18. 【毕设】基于HTML的零食商城网站大前端开发设计(含文档)
  19. Jquery实现表格动态增加一行,删除一行(最简洁的代码实现)
  20. APT(Advanced Packaging Tool)

热门文章

  1. 【2022.05.31】大学本科毕业总结,再见北理工
  2. 企业宣传画册印刷产品的作用和功能
  3. 三年成长为顶级coder实录---京东技术学院院长吕建伟(阿朱)
  4. 让同行都忍不住充值的营销方案,饭店只用一招当天锁定3百个会员
  5. 【GPU】NVIDIA驱动安装
  6. 无法停止‘通用卷’设备 解决方法
  7. AI风起荆楚,人工智能中国体系即刻启航
  8. web版本 开源压测工具_14款好用开源的Web应用压力负载,性能测试工具推荐
  9. Linux安装Java(1.8)
  10. 小程序支付管理-新版支付对接流程