#include<cstdio>
#include<cstring>
#define INF 99999999
#define min(p,q) p<q? p:q
int dist[150][150];
int dis[150];
int v[150];
void Dijkstra()
{
int i,j;
for(i=65;i<=122;i++){
dis[i]=dist[90][i];
//printf("%d %c\n",dis[i],i);
}
v[90]=1;
for(i=65;i<=122;i++){
int min = INF;
int k;
for(j=65;j<=122;j++){
if(!v[j] && min>dis[j]){
min = dis[j];
k=j;
//printf("->%d %c\n",dis[j],j);
}
}
if(dis[k]==INF)
break;
v[k]=1;
for(j=65;j<=122;j++){
if(!v[j] && min+dist[k][j]<dis[j]){
dis[j] = min+dist[k][j];
//printf("%d %c %c\n",dis[j],k,j);
}
}
}
}
int main()
{
int n,v,i,j;
for(i=65;i<=122;i++)
for(j=65;j<=122;j++)
dist[i][j]=INF;
char s1[2],s2[2];
scanf("%d",&n);
getchar();
while(n--){
scanf("%s%s%d",s1,s2,&v);
v=min(dist[s1[0]][s2[0]],v);
dist[s1[0]][s2[0]]=v;
dist[s2[0]][s1[0]]=v;
//printf("%d %d %d\n",dist[s1[0]][s2[0]],s1[0],s2[0]);
}
Dijkstra();
int min = INF,yy;
for(i=65;i<=89;i++)
//printf("%d ",dis[i]);
if(min>dis[i]){
min=dis[i];
yy=i;
}
printf("%c %d\n",yy,min);
return 0;
}
这题最坑的就是同一条路有不同的权值,要取最小的权值!!!
v=min(dist[s1[0]][s2[0]],v);
其它就看你对Dijkstra的理解了!