//5507014 2012-03-09 19:10:33 Accepted 2112 703MS 312K 1943 B G++ zjwzcnjsy
//无向图+重边
//注意:n=0和s==e的情况
#include <stdio.h>
#include <string.h>
#define inf 0x3fffffff
int 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;
}
hdu2112-最短路(dijkstra)
最新推荐文章于 2021-04-12 07:44:35 发布