题解
最短路径题,以Z为起点,用Dijkstra算法秒杀。注意会有重复边要取最小。
ps: DJ法还可以进一步用堆优化。
Code
// head files excluded
using namespace std;
const int INF = 1e8;
int n,m;
int dis[53][53];
int sd[52];
bool vis[52];
void init(){
for(int i=0;i<52;i++)
for(int j=0;j<52;j++)
if(i==j)dis[i][j]=0;
else dis[i][j]=INF;
}
int main(void){
cin>>n;
char a,b;
int d,tmpi,tmpj;
init();
for(int i=0;i<n;i++){
cin>>a>>b>>d;
if(isupper(a)) tmpi = a-'A' +26;
else tmpi = a-'a';
if(isupper(b)) tmpj = b-'A' +26;
else tmpj = b-'a';
if(dis[tmpi][tmpj]>d)
dis[tmpi][tmpj] = dis[tmpj][tmpi] = d;
}
for(int i=0;i<52;i++){
sd[i] = dis[51][i];
vis[i]=false;
}
vis[51]=true;
int p;
for(int i=0;i<51;i++){
d=INF;
for(int j=0;j<52;j++){ // search the nearest unvisited one
if(vis[j]==false && sd[j]<d){
d=sd[j];
p=j;
}
}
vis[p]=true;
for(int k=0;k<52;k++){ // release
if( dis[p][k] < INF){
if( sd[k]>sd[p]+dis[p][k])
sd[k] = sd[p]+dis[p][k];
}
}
}
int ans;
d=INF;
for(int i=26;i<51;i++)
if( sd[i]<d) {
d=sd[i];
ans = i;
}
a = 'A'+ans-26;
cout<< a<<" "<<d<<endl;
return 0;
}