最短路
Time Limit : 5000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 82 Accepted Submission(s) : 51
Problem 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 Input
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
Sample Output
3 2
dijskra代码:
1 #include<stdio.h> 2 #include<string.h> 3 const int INF=0x3f3f3f3f; 4 const int MAXN=1010; 5 #define MIN(x,y) (x<y?x:y) 6 int map[MAXN][MAXN]; 7 int vis[MAXN],d[MAXN]; 8 int N; 9 void initial(){ 10 memset(d,INF,sizeof(d)); 11 memset(vis,0,sizeof(vis)); 12 memset(map,INF,sizeof(map)); 13 } 14 void dijkscra(int s){ 15 int k; 16 d[s]=0; 17 while(true){ 18 k=-1; 19 for(int i=1;i<=N;i++) 20 if(!vis[i]&&(k==-1||d[i]<d[k]))k=i; 21 if(k==-1)break; 22 vis[k]=1; 23 for(int i=1;i<=N;i++){ 24 d[i]=MIN(d[i],d[k]+map[k][i]); 25 } 26 } 27 } 28 int main(){ 29 int M; 30 int a,b,c; 31 while(~scanf("%d%d",&N,&M),N||M){ 32 initial(); 33 while(M--){ 34 scanf("%d%d%d",&a,&b,&c); 35 if(c<map[a][b]){ 36 map[a][b]=map[b][a]=c; 37 } 38 } 39 dijkscra(1); 40 printf("%d ",d[N]); 41 } 42 return 0; 43 }
SPFA算法:
1 #include<stdio.h> 2 #include<string.h> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 const int INF=0x3f3f3f3f; 7 const int MAXN=110; 8 const int MAXM=20010; 9 int top,vis[MAXN],dis[MAXN],head[MAXM]; 10 int N,M; 11 queue<int>dl; 12 struct Edge{ 13 int from,to,value,next; 14 }; 15 Edge edg[MAXM]; 16 void initial(){ 17 top=0; 18 memset(vis,0,sizeof(vis)); 19 memset(dis,INF,sizeof(dis)); 20 memset(head,-1,sizeof(head)); 21 while(!dl.empty())dl.pop(); 22 } 23 void add(int u,int v,int value){ 24 Edge E={u,v,value,head[u]}; 25 edg[top]=E; 26 head[u]=top++; 27 } 28 void SPFA(int sx){ 29 dl.push(sx); 30 dis[sx]=0; 31 vis[sx]=1; 32 while(!dl.empty()){ 33 int u=dl.front(); 34 dl.pop(); 35 vis[u]=0; 36 for(int i=head[u];i!=-1;i=edg[i].next){ 37 int v=edg[i].to; 38 if(dis[u]+edg[i].value<dis[v]){ 39 dis[v]=dis[u]+edg[i].value; 40 if(!vis[v]){ 41 vis[v]=1; 42 dl.push(v); 43 } 44 } 45 } 46 } 47 printf("%d ",dis[N]); 48 } 49 int main(){ 50 int a,b,c; 51 while(~scanf("%d%d",&N,&M),N|M){ 52 initial(); 53 while(M--){ 54 scanf("%d%d%d",&a,&b,&c); 55 add(a,b,c); 56 add(b,a,c); 57 } 58 SPFA(1); 59 } 60 return 0; 61 }
Bellman:
1 #include<stdio.h> 2 #include<string.h> 3 #define MIN(x,y)(x<y?x:y) 4 #define mem(a,b) memset(a,b,sizeof(a)) 5 const int INF=0x3f3f3f3f; 6 const int MAXN=110; 7 const int MAXM=10010<<1; 8 struct Node{ 9 int u,v,w; 10 }; 11 Node dt[MAXM]; 12 int dis[MAXN]; 13 int top,N; 14 void add(int u,int v,int w){ 15 dt[top].u=u; 16 dt[top].v=v; 17 dt[top++].w=w; 18 } 19 void Bellman(int sx){ 20 mem(dis,INF); 21 dis[sx]=0; 22 for(int j=1;j<=N;j++) 23 for(int i=0;i<top;i++){ 24 int u=dt[i].u,v=dt[i].v,w=dt[i].w; 25 dis[v]=MIN(dis[v],dis[u]+w); 26 } 27 } 28 int main(){ 29 int M; 30 while(~scanf("%d%d",&N,&M),N||M){ 31 int a,b,c; 32 top=0; 33 while(M--){ 34 scanf("%d%d%d",&a,&b,&c); 35 add(a,b,c); 36 add(b,a,c); 37 } 38 Bellman(1); 39 printf("%d ",dis[N]); 40 } 41 return 0; 42 }