hdu2112-最短路(dijkstra)
来源:互联网 发布:5g网络什么时候出来的 编辑:程序博客网 时间:2024/04/28 07:38
//55070142012-03-09 19:10:33Accepted2112703MS312K1943 BG++zjwzcnjsy//无向图+重边//注意:n=0和s==e的情况#include <stdio.h>#include <string.h>#define inf 0x3fffffffint map[151][151];int n,t,k;char s[31];char e[31];char name[150][31];int search(char s[]){ for(int i=0;i<k;++i) if(strcmp(s,name[i])==0)return i; return -1;}int Dijkstra(int s){ int i,u,v[151],mins,min[151]; for(i=0;i<k;++i)min[i]=map[0][i],v[i]=0; min[0]=0; v[0]=1; while(1) { mins=inf; for(i=0;i<k;++i) { if(!v[i] && min[i]<mins) { mins=min[i];u=i; } } if(u==1)return mins; if(mins==inf)break; v[u]=1; for(i=0;i<k;++i) { if(!v[i] && min[u]+map[u][i]<min[i]) { min[i]=min[u]+map[u][i]; } } } //for(i=0;i<k;++i) // printf("-->%d\n",min[i]); return min[1];}void dbg(){ int i,j; for(i=0;i<k;++i) { for(j=0;j<k;++j) printf("%10d",map[i][j]); printf("\n"); }}int main(){ int i,j; while(~scanf("%d",&n),n+1) { if(n==0){printf("-1\n");continue;} k=0; scanf("%s%s",name[0],name[1]); k+=2; for(i=0;i<151;i++) for(j=0;j<151;++j) { map[i][j]=inf; if(i==j)map[i][j]=0; } for(int i=0;i<n;++i) { scanf("%s%s%d",s,e,&t); int ts=search(s); if(ts==-1){strcpy(name[k],s);ts=k++;} int te=search(e); if(te==-1){strcpy(name[k],e);te=k++;} if(map[ts][te]>t)map[te][ts]=map[ts][te]=t; } // dbg(); if(strcmp(name[0],name[1])==0){printf("0\n");continue;} int ans=Dijkstra(0); if(ans==inf)printf("-1\n"); else printf("%d\n",ans); } return 0;}