Dijkstra求最短路径和次短路径,类似求次大值
2016-11-07 17:10
190 查看
首先,有时候题目需要得到的不是最值,而是次值。
与我们求最值过程类似,我们求最值,若是最值被替换,原来的最值就变成次值,若是次值可以更新就更新。
没有增加多少难度。
例
USACO 2006 Nov Roadblocks
核心代码
这里就体现的开始说的;
另外提的,操作次数要翻一倍,以为我们多了次短路的求值;
完整的
与我们求最值过程类似,我们求最值,若是最值被替换,原来的最值就变成次值,若是次值可以更新就更新。
没有增加多少难度。
例
USACO 2006 Nov Roadblocks
核心代码
for (int j=last[u];j;j=e[j].next) { int v=e[j].to; int k=e[j].v; if (mind+k<=dist[v][0]) { dist[v][1]=dist[v][0]; dist[v][0]=mind+k; } else if (mind+k<dist[v][1]) { dist[v][1]=mind+k; }
这里就体现的开始说的;
另外提的,操作次数要翻一倍,以为我们多了次短路的求值;
完整的
#include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> #define INF 0x3f3f3f3f #define maxn 50010 struct edge{ int to,next,v; }e[maxn*4]; int last[maxn],dist[maxn][2]; bool vis[maxn][2]; int n,m,tot; void add(int x,int y,int z) { tot++; e[tot].to=y; e[tot].next=last[x]; last[x]=tot; e[tot].v=z; } void dijkstra(int s) { dist[s][0]=0; for (int i=1;i<n*2;i++) { int mind=INF; int u=0; bool flag=0; for (int j=1;j<=n;j++) { if (!vis[j][0] && dist[j][0]<mind) { mind=dist[j][0]; flag=0; u=j; } else if (!vis[j][1] && dist[j][1]<mind)//也要把次短路考虑进去 { mind=dist[j][1]; flag=1; u=j; } } if (mind==INF || flag>1) break; vis[u][flag]=1; for (int j=last[u];j;j=e[j].next) { int v=e[j].to; int k=e[j].v; if (mind+k<=dist[v][0]) //这里和求最大值次大值是一样的 { dist[v][1]=dist[v][0]; dist[v][0]=mind+k; } else if (mind+k<dist[v][1]) { dist[v][1]=mind+k; } } } } int main(){ tot=0; scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z); } for (int i=0;i<=n;i++) dist[i][0]=dist[i][1]=INF,vis[i][0]=vis[i][1]=0; dijkstra(1); printf("%d",dist [1]); return 0; }
相关文章推荐
- 九度1008&&HDU - 3790:最短路径问题 (最短路径dijkstra)
- poj_2387(最短路径Dijkstra)
- 最短路径之Dijkstra+Floyd算法
- 初学图论-Dijkstra单源最短路径算法基于优先级队列(Priority Queue)的实现
- HDU 3790 最短路径问题 裸跑dijkstra
- 最短路径 【Dijkstra】
- 模板 图的遍历 bfs+dfs 图的最短路径 Floyed+Dijkstra
- HDU 3790 最短路径问题 (dijkstra+路长和权值)
- zoj 1891 - 传说中的简答题 - 最短路径 - dijkstra
- hdoj-1869 六度分离【最短路径--dijkstra&&spfa&&floyd】
- 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)
- Part Acquisition--(最短路径,Dijkstra)
- HDU -- 3790 最短路径问题 (Dijkstra+priority_queue)
- 最短路径Dijkstra(邻接矩阵)
- 【C# dijkstra迪杰斯特拉算法 最短路径】迪杰斯特拉算法 最短路径的C#实现
- hdu1548 A strange lift(bfs 或Dijkstra最短路径)
- dijkstra_最短路径_hdu_3790
- 关于用Dijkstra求最短路径的学习小结(附上源码)
- hdu 2544 单源最短路径(邻接矩阵Dijkstra实现)
- matlab练习程序(单源最短路径Dijkstra)