dijkstra算法求到达Z的最近的大写字母,注意两点间可能有多个路径,选最短即可。
/*
ID: jinusac1
PROG: comehome
LANG: C++
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int path[60][60]={0},dis[60];
bool mark[60]={false};
int main()
{
freopen("comehome.in","r",stdin);
freopen("comehome.out","w",stdout);
int n;
scanf("%d",&n);getchar();
memset(dis,1,sizeof(dis));
memset(path,-1,sizeof(path));
for(int i=1;i<=n;i++){
char ta,tb;
int len;
scanf("%c %c %d",&ta,&tb,&len);getchar();
int a,b;
if(ta>='A'&&ta<='Z') a=ta-'A'+26;
else a=ta-'a';
if(tb>='A'&&tb<='Z') b=tb-'A'+26;
else b=tb-'a';//将字母hash成数字
if(path[a][b]==-1)
path[a][b]=path[b][a]=len;
else if(len<path[a][b])
path[a][b]=path[b][a]=len;//因为两点之间可能有多条路径,选最短
}
for(int i=0;i<52;i++) path[i][i]=0;
int p=51;
dis[p]=0;mark[p]=true;
while(true){
int Min=1000000,mp=0;
for(int i=0;i<52;i++){
if(mark[i]) continue;
if(path[p][i]!=-1)
if((dis[p]+path[p][i])<dis[i]) dis[i]=dis[p]+path[p][i];
if(dis[i]<Min) {Min=dis[i];mp=i;}
}//dijkstra算法求最短路径
p=mp;
mark[p]=true;
if(p>25) break;
}
printf("%c %d\n",'A'+p-26,dis[p]);
return 0;
}