http://acm.hdu.edu.cn/showproblem.php?pid=2112
把地名和数字对应一下,就变成模板题了
#include <iostream> #include <string> using namespace std; const int INF=10000000; const int maxn=101; int nid,f; int Map[maxn][maxn]; int vis[maxn]; int dis[maxn]; string Id[maxn]; int strtonum(string s) { for(int i=0;i<nid;i++) if(Id[i] == s) return i; Id[nid]=s; return nid++; } int Dijkstra(int s,int t) { for(int i=0;i<nid;i++) dis[i]=INF; dis[s]=0; for(int i=0;i<nid;i++) { int ans=INF,u; for(int j=0;j<nid;j++) if(!vis[j] && dis[j]<ans) { ans=dis[j]; u=j; } vis[u]=1; if(u==t){f=1;return ans;} for(int j=0;j<nid;j++) if(Map[u][j]!=INF && dis[j]>Map[u][j]+dis[u]) dis[j]=Map[u][j]+dis[u]; } } int main() { int n; while(scanf("%d",&n),n!=-1) { nid=f=0; memset(vis,0,sizeof(vis)); for(int i=0;i<maxn;i++) for(int j=0;j<maxn;j++) Map[i][j]=INF; string p,q,a,b; int d,s,t; cin >> p >> q; s=strtonum(p); t=strtonum(q); while(n--) { cin >> a >> b >> d; int x,y; x=strtonum(a); y=strtonum(b); if(Map[x][y]>d) Map[x][y]=Map[y][x]=d; } int ans=Dijkstra(s,t); if(f) printf("%d\n",ans); else puts("-1"); } return 0; }