2017 Multi-University Training Contest 10 1011 Two Paths HDU 6181 (次短路)
来源:互联网 发布:windows日志查询 编辑:程序博客网 时间:2024/06/06 11:38
题意:给你一个有向图,问你他的次短路长度(与最短路至少有一条边不同即可)
思路:如果最短路有多条,那答案就是最短路,否则就是次短路
求次短路(见点击打开链接):
- 思路:
- 把求最短路时更新最短路的那部分改一下。
- dis1,dis2数组分别记录到该点的最短路和次短路
- 分三种情况:
- 1.若该点最短路+下一条边比到下个点的最短路短,则更新下个点的最短路,同时更新次短路为原最短路
- 2.若该点次短路+下一条边比到下个点的次短路短,则更新下个点的次短路
- 3.若该点最短路+下一条边比到下个点的最短路长同时比下个点的次短路短,则更新下个点的次短路
代码:
#include<iostream>#include<cstdio>#include<queue>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;const int maxn = 2e5+5;const ll INF = 0x3f3f3f3f3f3f3f3f;int n, m, k, head[maxn];ll cnt[maxn];ll dis1[maxn], dis2[maxn], dis[maxn];bool book[maxn];struct node{ int v, w, next;}edge[maxn];void addEdge(int u, int v, int w){ edge[k].v = v; edge[k].w = w; edge[k].next = head[u]; head[u] = k++;}void spfa(int u){ for(int i = 1; i <= n; i++) dis1[i] = INF; for(int i = 1; i <= n; i++) dis2[i] = INF; memset(book, 0, sizeof(book)); queue<int> q; q.push(u); dis1[u] = 0; book[u] = 1; while(!q.empty()) { u = q.front(); q.pop(); book[u] = 0; for(int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].v; int w = edge[i].w; if(dis1[v] > dis1[u]+w) { dis2[v] = dis1[v]; dis1[v] = dis1[u]+w; if(!book[v]) book[v] = 1, q.push(v); } if(dis2[v] > dis2[u]+w) { dis2[v] = dis2[u]+w; if(!book[v]) book[v] = 1, q.push(v); } if(dis1[v] < dis1[u]+w && dis2[v] > dis1[u]+w) { dis2[v] = dis1[u]+w; if(!book[v]) book[v] = 1, q.push(v); } } }}void spfa2(int u){ for(int i = 1; i <= n; i++) dis[i] = INF; memset(book, 0, sizeof(book)); queue<int> q; q.push(u); book[u] = cnt[u] = 1; dis[u] = 0; while(!q.empty()) { u = q.front(); q.pop(); book[u] = 0; for(int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].v; int w = edge[i].w; if(dis[u]+w < dis[v]) { dis[v] = dis[u]+w; if(!book[v]) book[v] = 1, q.push(v); cnt[v] = cnt[u]; } else if(dis[u]+w == dis[v]) { cnt[v] += cnt[u]; } } }}int main(void){ int t; cin >> t; while(t--) { k = 0; memset(cnt, 0, sizeof(cnt)); memset(head, -1, sizeof(head)); scanf("%d%d", &n, &m); for(int i = 1; i <= m; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); addEdge(u, v, w); addEdge(v, u, w); } spfa(1); spfa2(1); if(cnt[n] > 1) printf("%lld\n", dis1[n]); else printf("%lld\n", dis2[n]); } return 0;}
阅读全文
1 0
- 2017 Multi-University Training Contest 10 1011 Two Paths HDU 6181 (次短路+最短路数量)
- 2017 Multi-University Training Contest 10 1011 Two Paths HDU 6181 (次短路)
- HDU-6181 Two Paths(2017 Multi-University Training Contest
- HDU 3068 2017 Multi-University Training Contest
- HDU 6034 & 2017 Multi-University Training Contest
- hdu 6034 2017 Multi-University Training Contest
- HDU 3065 2017 Multi-University Training Contest
- HDU 6047 2017 Multi-University Training Contest
- HDU 6052 2017 Multi-University Training Contest
- HDU 6058 2017 Multi-University Training Contest
- HDU 6078 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest 9 && HDU 6166 Senior Pan 【最短路+思维】
- 2017 Multi-University Training Contest 2 1011
- DP——Two ( HDU 5791 ) ( 2016 Multi-University Training Contest 5 1011 )
- 2016 Multi-University Training Contest 5 1011 Two(DP)
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- CDH5.11.0安装启动hive过程org.apache.hadoop.hive.metastore.HiveMetaException: Failed to load driver
- phpStorm设置显示代码行号
- 计算缓存大小+清除缓存
- demo5,鼠标移入移出改变样式,总结
- 自动轮播+频道管理 练习
- 2017 Multi-University Training Contest 10 1011 Two Paths HDU 6181 (次短路)
- 《调试九法:软硬件的错误排查之道》小结摘录
- #define 的特殊用法 ... __VA_ARGS__
- 【Java面试知识点】Java 最佳实践的面试问题
- 15 分钟学会使用 Git 和远程代码库
- Spring学习笔记(一)IOC
- LintCode:H-Sliding Window Median
- C#基础-006(3) 判断一个年份是否为闰年
- python实现-明明的随机数