题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112
这个题目有点坑,就是有可能起点和终点在同一个地方,所以得保存起点和终点;
#include<iostream> #include<string> #include<cstdio> #include<cstring> #include<map> #include<queue> #include<cmath> #include<stack> #include<set> #include<vector> #include<algorithm> #define LL long long #define inf 1<<29 #define s(a) scanf("%d",&a) #define CL(a,b) memset(a,b,sizeof(a)) using namespace std; const int N=155; int n,m,a,b,cnt; int Map[N][N]; int dist[N]; bool vis[N]; string s,e,s1,e1; void dijkstra() { CL(vis,false); for(int i=1;i<cnt;i++) dist[i]=Map[1][i]; vis[1]=true; while(1){ int v=-1; for(int u=1;u<cnt;u++) if(!vis[u]&&(v==-1||dist[u]<dist[v])) v=u; if(v==-1) break; vis[v]=true; for(int u=1;u<cnt;u++) dist[u]=min(dist[u],dist[v]+Map[v][u]); } } int main() { cin.sync_with_stdio(false); while(cin>>n){ if(n==-1) break; cin>>s1>>e1; map<string,int>m; m[s1]=1;m[e1]=2; cnt=3; for(int i=1;i<=150;i++){ for(int j=1;j<=150;j++) Map[i][j]=Map[j][i]=inf; Map[i][i]=0; } int t; while(n--){ cin>>s>>e>>t; if(!m[s]) m[s]=cnt++; if(!m[e]) m[e]=cnt++; if(Map[m[s]][m[e]]>t) Map[m[s]][m[e]]=Map[m[e]][m[s]]=t; } if(s1==e1){ cout<<0<<endl; continue; } dijkstra(); if(dist[2]<inf) cout<<dist[2]<<endl; else cout<<"-1"<<endl; } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-03 21:42:40