最短路(dijskra+SPFA+Bellman)
2015-08-17 19:50
671 查看
最短路
Time Limit : 5000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)Total Submission(s) : 82 Accepted Submission(s) : 51
[align=left]Problem Description[/align]
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
[align=left]Input[/align]
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。输入保证至少存在1条商店到赛场的路线。
[align=left]Output[/align]
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
[align=left]Sample Input[/align]
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
[align=left]Sample Output[/align]
3 2
dijskra代码:
#include<stdio.h> #include<string.h> const int INF=0x3f3f3f3f; const int MAXN=1010; #define MIN(x,y) (x<y?x:y) int map[MAXN][MAXN]; int vis[MAXN],d[MAXN]; int N; void initial(){ memset(d,INF,sizeof(d)); memset(vis,0,sizeof(vis)); memset(map,INF,sizeof(map)); } void dijkscra(int s){ int k; d[s]=0; while(true){ k=-1; for(int i=1;i<=N;i++) if(!vis[i]&&(k==-1||d[i]<d[k]))k=i; if(k==-1)break; vis[k]=1; for(int i=1;i<=N;i++){ d[i]=MIN(d[i],d[k]+map[k][i]); } } } int main(){ int M; int a,b,c; while(~scanf("%d%d",&N,&M),N||M){ initial(); while(M--){ scanf("%d%d%d",&a,&b,&c); if(c<map[a][b]){ map[a][b]=map[b][a]=c; } } dijkscra(1); printf("%d\n",d ); } return 0; }
SPFA算法:
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; const int INF=0x3f3f3f3f; const int MAXN=110; const int MAXM=20010; int top,vis[MAXN],dis[MAXN],head[MAXM]; int N,M; queue<int>dl; struct Edge{ int from,to,value,next; }; Edge edg[MAXM]; void initial(){ top=0; memset(vis,0,sizeof(vis)); memset(dis,INF,sizeof(dis)); memset(head,-1,sizeof(head)); while(!dl.empty())dl.pop(); } void add(int u,int v,int value){ Edge E={u,v,value,head[u]}; edg[top]=E; head[u]=top++; } void SPFA(int sx){ dl.push(sx); dis[sx]=0; vis[sx]=1; while(!dl.empty()){ int u=dl.front(); dl.pop(); vis[u]=0; for(int i=head[u];i!=-1;i=edg[i].next){ int v=edg[i].to; if(dis[u]+edg[i].value<dis[v]){ dis[v]=dis[u]+edg[i].value; if(!vis[v]){ vis[v]=1; dl.push(v); } } } } printf("%d\n",dis ); } int main(){ int a,b,c; while(~scanf("%d%d",&N,&M),N|M){ initial(); while(M--){ scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } SPFA(1); } return 0; }
Bellman:
#include<stdio.h> #include<string.h> #define MIN(x,y)(x<y?x:y) #define mem(a,b) memset(a,b,sizeof(a)) const int INF=0x3f3f3f3f; const int MAXN=110; const int MAXM=10010<<1; struct Node{ int u,v,w; }; Node dt[MAXM]; int dis[MAXN]; int top,N; void add(int u,int v,int w){ dt[top].u=u; dt[top].v=v; dt[top++].w=w; } void Bellman(int sx){ mem(dis,INF); dis[sx]=0; for(int j=1;j<=N;j++) for(int i=0;i<top;i++){ int u=dt[i].u,v=dt[i].v,w=dt[i].w; dis[v]=MIN(dis[v],dis[u]+w); } } int main(){ int M; while(~scanf("%d%d",&N,&M),N||M){ int a,b,c; top=0; while(M--){ scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } Bellman(1); printf("%d\n",dis ); } return 0; }
相关文章推荐
- extjs_04_grid(弹出窗口&行编辑器 CRUD数据)
- WebRTC入门篇
- 20150814 JavaScript深入浅出下
- 20150813 JavaScript深入浅出(上)
- 第4章 JSP技术概述
- JS的常用正则表达式 验证密码
- C# Json反序列化 数据协定类型 无法反序列化 因为未找到必需的数据成员
- C# Json反序列化 数据协定类型 无法反序列化 因为未找到必需的数据成员
- 不要再说js获取后台变量
- JavaScript闭包
- js 作用域与作用域链
- JavaScript的闭包
- gem install json失败
- gem install json失败
- js中的prototype
- JS解析url
- JavaScript高级程序设计笔记(5)
- JSTL的时间格式化标签的使用
- JavaScript DOM 总结
- js实现Select头像选择实时预览代码