用的map映射为整数,后面就和普通的最短路一样的,注意头文件。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<stack> #include<queue> #include<map> using namespace std; #define inf 10000000 int a[505][505],book[505],dis[505]; int n,m; char b[35],c[35]; int flag; void init() { n=0; flag=0; memset(book,0,sizeof(book)); for(int i=0;i<=155;i++){ for(int j=0;j<=155;j++){ a[i][j]=inf; } } map<string,int>station; station.clear(); scanf("%s%s",b,c); if(strcmp(b,c)==0){flag=1;} station[b]=1; station[c]=2; n=2; int dd; for(int i=1;i<=m;i++){ scanf("%s%s%d",b,c,&dd); if(!station[b]){ station[b]=++n; //cout<<station[b]<<endl; } if(!station[c]){ station[c]=++n; //cout<<station[c]<<endl; } a[station[b]][station[c]]=a[station[c]][station[b]]=dd; } } void dij() { for(int i=1;i<=n;i++){ dis[i]=a[1][i]; } book[1]=1; for(int i=1;i<=n-1;i++){ int u=0,mmin=inf; for(int j=1;j<=n;j++){ if(book[j]==0&&dis[j]<mmin){ mmin=dis[j]; u=j; } } book[u]=1; for(int k=1;k<=n;k++){ if(!book[k]&&dis[k]>dis[u]+a[u][k]){ dis[k]=dis[u]+a[u][k]; } } } } int main() { while(scanf("%d",&m)!=EOF) { if(m==-1){return 0;} init(); dij(); if(flag==1){printf("0\n");} else { if(dis[2]<inf){ printf("%d\n",dis[2]);} else { printf("-1\n"); } } } }
转载请标明出处:HDU Today HDU - 2112
文章来源: HDU Today HDU - 2112