HDU Today HDU - 2112

匿名 (未验证) 提交于 2019-12-02 22:59:29

用的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
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!