这道题是图的最短路径,用dijkstra可以求解。注意路径之间的重复问题。代码如下。
#include <iostream>
#include <cstdio>
#include <cstring>
#define inf 9999999
using namespace std;
int main(){
freopen ("comehome.in","r",stdin);
freopen ("comehome.out","w",stdout);
int cur[55][55],dis[10005],book[10005],judge[10005],i,j,n,N,u,v,min;
cin>>N;
n=52;
for(i=1;i<=55;i++){
for(j=1;j<=55;j++) {
cur[i][j]=inf;
}
}
for(i=1;i<=N;i++){
int x1=0,x2=0;
char c1,c2;
cin>>c1>>c2;
if (c1<'Z'){
x1=c1-'A'+1;
judge[x1]=1;
}
else {
x1=c1-'a'+27;
}
if (c2<'Z'){
x2=c2-'A'+1;
judge[x2]=1;
}
else {
x2=c2-'a'+27;
}
if (c1=='Z'){
x1=26;
}
if (c2=='Z'){
x2=26;
}
int in=0;
cin>>in;
if (cur[x1][x2]!=inf&&in>cur[x1][x2]){
continue;
}
cur[x1][x2]=in;
cur[x2][x1]=in;
}
for(i=1;i<=n;i++){
dis[i]=cur[26][i];
}
for(i=1;i<=n;i++){
book[i]=0;
}
book[26]=1;
for(i=1;i<=n-1;i++){
min=inf;
for(j=1;j<=n;j++){
if(book[j]==0 && dis[j]<min){
min=dis[j];
u=j;
}
}
book[u]=1;
for(v=1;v<=n;v++){
if(cur[u][v]<inf){
if(dis[v]>dis[u]+cur[u][v]){
dis[v]=dis[u]+cur[u][v];
}
}
}
}
int minn=inf,k=0;
for (i=1;i<=n;i++){
if (judge[i]&&dis[i]<minn){
minn=dis[i];
k=i;
}
}
char c=k-1+'A';
cout<<c<<" "<<minn<<endl;
return 0;
}