map好像挺慢的
#include<iostream>#include<string>#include<cstdio>#include<map>#define INF 0x3f3f3f3fusing namespace std;int dis[155][155],cost[155];bool vis[155];map<string,int>list;void dijkstra(int s,int t,int len){int i,j,mini;int pos;for(i=1;i<=len;i++){vis[i]=0;cost[i]=dis[s][i];}vis[s]=1;cost[s]=0;for(i=1;i<=len-1;i++){mini=INF;pos=i; //這一步純粹是為了保險for(j=1;j<=len;j++)if(!vis[j]&&cost[j]<mini){mini=cost[j];pos=j;}if(mini>=INF||pos==t) break; //出發點道目的地路徑不存在或者已經找到最短路徑時就沒有必要再算下去了vis[pos]=1;for(j=1;j<=len;j++)if(!vis[j]&&cost[pos]+dis[pos][j]<cost[j])cost[j]=cost[pos]+dis[pos][j];}if(cost[t]>=INF)printf("-1\n");elseprintf("%d\n",cost[t]);}int main(){int n;string start,dest,from,to;int route;while(scanf("%d",&n)&&n!=-1){list.clear();memset(dis,0x3f,sizeof(dis));int len=1;cin>>start>>dest;while(n--){cin>>from>>to>>route;if(list.find(from)==list.end())list[from]=len++;if(list.find(to)==list.end())list[to]=len++;if(route<dis[list[from]][list[to]]) //去除萬惡的重邊dis[list[from]][list[to]]=dis[list[to]][list[from]]=route; //路線是雙向的,題目也沒說清楚比較坑爹}if(list.find(start)==list.end()||list.find(dest)==list.end()){printf("-1\n"); continue;}dijkstra(list[start],list[dest],len-1);}return 0;}