题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112
题目大意:其实如果将车站编号从英文换成数字,那么这道题就是非常简单的最短路问题了,所以这道题的窍门就是想办法把英文编号转换为数字编号;这道题意思就是给你一个起始车站和终点车站,通过转车站得到起始车站到终点车站的最短距离,若不能到达则输出-1;
上代码:
#include<bits/stdc++.h> using namespace std; const int maxn=110; const int MAX=0x3f3f3f3f; int book[maxn],mp[maxn][maxn]; void djk(int start ,int end){ int i,j,k; for(i=0;i<end;i++){ int mi=MAX,u; for(j=start;j<=end;j++){ if(mp[start][j]<mi&&!book[j]){ mi=mp[start][j]; u=j; } } book[u]=1; for(k=start;k<=end;k++){ if(mp[u][k]!=MAX){ if(mp[start][k]>mp[start][u]+mp[u][k]){ mp[start][k]=mp[start][u]+mp[u][k]; } } } } } int main() { int n,i,j,k,x; map<string,int>sta; while(cin>>n&&n!=-1){ sta.clear();//注意,此处不可少; memset(book,0,sizeof(book)); memset(mp,MAX,sizeof(mp)); string s1,s2; cin>>s1>>s2;//输入起始车站和终点车站; sta[s1]=1;sta[s2]=2;//令起点车站的编号为1,终点车站的编号为2; int ite=3;//声名一个变量表示其他车站的编号 string str1,str2; for(i=0;i<n;i++){ cin>>str1>>str2>>x;//输入路径; if(!sta[str1])//若该车站编号尚未转换成数字,将其转换成数字; sta[str1]=ite++; if(!sta[str2])//同上 sta[str2]=ite++; mp[sta[str1]][sta[str2]]=x;//接下来就是一般的djkstra操作的,不详细述说了; mp[sta[str2]][sta[str1]]=x; } if(s1==s2){ cout<<0<<endl; continue; } book[1]=1; djk(1,ite); if(mp[1][2]==MAX) cout<<-1<<endl; else cout<<mp[1][2]<<endl; } }