HDU1385 【输出字典序最小的最短路】
2013-09-05 19:02
204 查看
这题经过的结点比较好处理。
主要是字典序的处理。
先是floyd做法,采用记录后驱的方法。 path[i][j]=j【初始化。。。】
接下来是spfa的做法。
主要是字典序的处理。
先是floyd做法,采用记录后驱的方法。 path[i][j]=j【初始化。。。】
#include <iostream> #include <cstdio> #include <cstring> #include <cstring> using namespace std; const int maxn=5000; const int INF=100000000; int n; int node[maxn]; int dist[maxn][maxn]; int path[maxn][maxn]; void floyd() { for(int i=1;i<=n;i++)//初始化 有一种后驱的感觉 for(int j=1;j<=n;j++) path[i][j]=j; for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { int temp=dist[i][k]+dist[k][j]+node[k]; if(dist[i][j]>temp) { dist[i][j]=temp; path[i][j]=path[i][k]; } if(dist[i][j]==temp) { if(path[i][j]>path[i][k]) path[i][j]=path[i][k]; } } } int main() { int a,be,en; while(scanf("%d",&n)&&n) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { scanf("%d",&a); if(a!=-1) dist[i][j]=a; else dist[i][j]=INF; } for(int i=1;i<=n;i++) scanf("%d",&node[i]); floyd(); int kcase=0; while(1) { if(kcase!=0) printf("\n"); kcase++; scanf("%d%d",&be,&en); if(be==-1&&en==-1) break; printf("From %d to %d :\n",be,en); printf("Path: "); printf("%d",be); int temp=be; while(temp!=en) { printf("-->%d",path[temp][en]); temp=path[temp][en]; } printf("\n"); printf("Total cost : %d\n",dist[be][en]); } } return 0; }
接下来是spfa的做法。
相关文章推荐
- HDU1385 【输出字典序最小的最短路】
- uva 10537 - The Toll! Revisited (逆向思维+最短路+输出字典序最小路径)
- UVA 10537 The Toll! Revisited(最短路变形+输出字典序最小路径)
- hdu1385 Minimum Transport Cost (floyd输出字典序最小的路径)
- Minimum Transport Cost hdu 点权和边权的最短路+输出字典序最小的路径
- zoj 3204 字典序最小的最小生成树的输出
- hdu 1814 Peaceful Commission (2-sat 输出字典序最小路径)
- 字典序最小的最短路
- ZOJ - 1729(最小表示法。 <<然后输出字典序最小
- ZOJ 3204 Connect them(最小生成树之Krusal 输出字典序最小的)
- poj 1815 Friendship 最小割 拆点 输出字典序
- HDU 1814 Peaceful Commission(2-sat 模板题输出最小字典序解决方案)
- poj 3715 最小覆盖集,并且输出字典序最小解
- light oj 1073 状态压缩dp+输出字典序最小的解
- hdu 1385 Minimum Transport Cost(最短路 + 字典序最小路径)
- ZOJ - 1729(最小表示法。 <<然后输出字典序最小
- 输出字典序最小的最小割集
- 2-sat按照最小字典序输出可行解(hdu1814)
- ZOJ - 1729(最小表示法。 <<然后输出字典序最小
- ZOJ 3204 Connect them (最小生成树,输出字典序最小的解)