最短路
来源:互联网 发布:游戏优化差会怎样 编辑:程序博客网 时间:2024/04/30 23:28
点击打开链接
一。题目:
最短路 Time Limit : 5000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)Total Submission(s) : 19 Accepted Submission(s) : 10Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据。每组数据第一行是两个整数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条商店到赛场的路线。 Output 对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间 Sample Input2 11 2 33 31 2 52 3 53 1 20 0 Sample Output32 Source UESTC 6th Programming Contest Online
2.代码:
#include<stdio.h>#include<string.h>#define max 0x7fffffffint map[110][110];int dist[110];int visit[110];int prev[110];void dijkstra(int n,int v){ memset(dist,-1,sizeof(dist));//注意初始化 for(int i=1; i<=n; i++) { dist[i]=map[v][i]; visit[i]=0; if(dist[i]!=max) prev[i]=v; else prev[i]=0;//并不是所有的prev都是v } dist[v]=0; visit[v]=1; for(int j=1; j<=n; j++)//注意 { int min=max; int u; for(int i=1; i<=n; i++) { if(dist[i]<min&&visit[i]==0) { min=dist[i]; u=i; } } visit[u]=1; int newdist; for(int i=1; i<=n; i++) { if(map[u][i]!=max&&visit[i]==0) { newdist=dist[u]+map[u][i]; if(newdist<dist[i]) { dist[i]=newdist; prev[i]=u; } } } }}int main(){ int n,m; int a,b,s; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) map[i][j]=map[j][i]=max; } for(int i=0; i<m; i++) { scanf("%d%d%d",&a,&b,&s); map[a][b]=s; map[b][a]=s; } dijkstra(n,1); printf("%d\n",dist[n]); }}/*2 11 2 33 31 2 52 3 53 1 20 0*/