不得不说,这是一道大水题啊=_=.
主要是如何解决输入,只要把它储存好,再用一下最短路问题,就一切搞定了~~~
#include <iostream>
#include <cstdio>#include <cmath>
#include <cstdlib>
using namespace std;
struct aaaa{char zimu;int wz;}mch[60];
int map[70][70],n,m=0,dis[60];
bool key[70];
void aaa(void);
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
char a,b;
int l,la,lb;
cin>>a>>b>>l;
if(a>='A'&&a<='Z'){
la=a-64;
if(mch[la].wz==0){
mch[la].wz=++m;
mch[la].zimu=a;
}
}
else {
la=a-70;
if(mch[la].wz==0){
mch[la].wz=++m;
mch[la].zimu=a;
}
}
la=mch[la].wz;
if(b>='A'&&b<='Z'){
lb=b-64;
if(mch[lb].wz==0){
mch[lb].wz=++m;
mch[lb].zimu=b;
}
}
else {
lb=b-70;
if(mch[lb].wz==0){
mch[lb].wz=++m;
mch[lb].zimu=b;
}
}
lb=mch[lb].wz;
if(map[la][lb]==0){map[la][lb]=l;map[lb][la]=l;}
else if(l<map[la][lb]){map[la][lb]=l;map[lb][la]=l;}
}
aaa();
int lll=99999999;
char zhixiang;
for(int i=1;i<=25;i++)
{
if(dis[mch[i].wz]!=-1&&mch[i].wz!=0&&dis[mch[i].wz]<lll){
lll=dis[mch[i].wz];
zhixiang=mch[i].zimu;
}
}
cout<<zhixiang<<" "<<lll<<endl;
return 0;
}
void aaa(void)
{
for(int i=1;i<=m;i++)
dis[i]=-1;
dis[mch[26].wz]=0;
for(int k=1;k<=m;k++){
int next,min=99999999;
for(int i=1;i<=m;i++){
if(!key[i]&&dis[i]!=-1&&dis[i]<min){
min=dis[i];
next=i;
}
}
key[next]=true;
for(int i=1;i<=m;i++){
if(!key[i]&&map[next][i]!=0&&(dis[i]>dis[next]+map[next][i]||dis[i]==-1))
dis[i]=dis[next]+map[next][i];
}
}
}