这道题关键在于字符串怎么转变成数字,我这里是用字符型二维数组进行处理,写出一个change函数用来返回字符串在数组里面存放的位置,之后就是典型的Dijkstra算法了。
附代码:
#include <iostream> #include <stdio.h> #include <string.h> #define INF 1<<25 using namespace std; int vis[160000]; const int N = 160; int dis[N][N], mini[N], m; char add[N][40]; void Init(){ for(int i=0;i<160;i++){ for(int j=0;j<160;j++){ if(i==j){ dis[i][j]=0; }else{ dis[i][j]=INF; } } } } int change(char *str){ int i; for(i=0;i<m;i++){ if(strcmp(add[i],str)==0){ return i; } } if(i==m){ strcpy(add[i],str); m++; return m-1; } } void dij(){ memset(vis,0,sizeof(vis)); for(int i=0;i<m;i++){ mini[i]=dis[0][i]; vis[i]=1; } vis[0]=0; for(int i=0;i<m;i++){ int mi=INF,mj; for(int j=0;j<m;j++){ if(vis[j]&&mini[j]<mi){ mi=mini[j]; mj=j; } }if(mi==INF) break; vis[mj]=0; for(int j=0;j<m;j++){ if(vis[j]&&mini[j]>mini[mj]+dis[mj][j]){ mini[j]=mini[mj]+dis[mj][j]; } }//while(1){}; } } int main() { int n; while(~scanf("%d",&n)&&n!=-1){ Init(); char st[40], ed[40], s1[40], s2[40]; int a, b, c; scanf("%s%s",st, ed); strcpy(add[0], st); strcpy(add[1], ed); m = 2;int i,j; for(i = 0; i < n; i++) { scanf("%s%s%d",s1, s2, &c); a = change(s1); b = change(s2); dis[a][b] = dis[b][a] = c; } if(strcmp(st, ed) == 0) { printf("0\n"); continue; } // Dijkstra(); dij(); /* for(int i=0;i<m;i++){ cout<<i<<" "<<mini[i]<<endl; }*/ if(mini[1]==INF) cout<<"-1"<<endl; else cout<<mini[1]<<endl; } return 0; }