题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=2112
题目大意:真·最短路问题
解题思想:Dij
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<iostream>
using namespace std;
#define INF 1<<25
#define maxn 160
int map[maxn][maxn],dis[maxn],book[maxn],m;
char name[maxn][50];
int charge(char *s)
{
int i;
for(i=0;i<m;i++)
if(strcmp(name[i],s)==0)return i;
if(i==m)
{
strcpy(name[m],s);m++;
return m-1;
}
}
int main()
{
int n;
while(~scanf("%d",&n)&&n!=-1)
{
for(int i=0;i<150;i++)
{
for(int j=0;j<150;j++)
{
if(i==j)map[i][j]=0;
else map[i][j]=INF;
}
}
char start[50],finish[50],str1[50],str2[50];
cin>>start>>finish;
strcpy(name[0],start);strcpy(name[1],finish);m=2;
int x,y,w;
for(int i=0;i<n;i++)
{
cin>>str1>>str2>>w;
x=charge(str1);y=charge(str2);
map[x][y]=map[y][x]=w;
}
/*for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
if (map[i][j]==INF)cout<<"inf ";
else cout<<map[i][j]<<" ";
}
cout<<endl;
}*/
if(strcmp(start,finish)==0){cout<<"0"<<endl;continue;}
for(int i=0;i<m;i++)dis[i]=map[0][i];
for(int i=0;i<m;i++)book[i]=0;
book[0]=1;
//for(int i=0;i<10;i++)cout<<dis[i]<<" ";cout<<endl;
for(int i=0;i<m-1;i++)
{
int minn=INF,u=0;
for(int j=0;j<m;j++)
{
if(book[j]==0&&dis[j]<minn)
{
minn=dis[j];
u=j;
}
}
if(minn==INF)break;
book[u]=1;
for(int v=0;v<m;v++)
{
if(dis[v]>dis[u]+map[u][v])
dis[v]=dis[u]+map[u][v];
}
}
//for(int i=0;i<10;i++)cout<<dis[i]<<" ";cout<<endl;
if(dis[1]==INF)cout<<"-1"<<endl;
else cout<<dis[1]<<endl;
}
return 0;
}