题目链接: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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU2112-HDU Today-最短路(dijkstra+字符转换)
原文地址:http://blog.csdn.net/wlxsq/article/details/48103239