一看又是最短路,最讨厌的是他非得用字符串,,,,处理能麻烦一点,还要注意数据范围,题上说的是每组不超过150个车站。
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
#define inf 100000000
int map[160][160],d[160];
char c[155][150],s1[50],s2[50];
bool vis[160];
int i,j,n,m;
int dijie(int st,int ov)
{
int k=st,temp=inf;
for(i=1; i<m; i++)
d[i]=map[st][i];
d[st]=0;
memset(vis,false,sizeof(vis));
vis[st]=true;
for(i=1; i<m; i++)
{
temp=inf;
for(j=1; j<m; j++)
{
if(d[j]<temp&&!vis[j])
{
temp=d[j];
k=j;
}
}
vis[k]=true;
for(j=1; j<m; j++)
{
if(!vis[j]&&d[j]>(d[k]+map[k][j]))
d[j]=d[k]+map[k][j];
}
}
return d[ov]==inf? -1: d[ov];
}
int find(char z[50])
{
for(j=1; j<m; j++)
{
if(strcmp(z,c[j])==0) return j;
}
// cout<<"j="<<j<<endl;
strcpy(c[m],z);
m++;
return m-1;
}
int main()
{
int start,over,u,v,w,flag;
while(cin>>n)
{
if(n==-1) break;
flag=0;
cin>>s1>>s2;
if(strcmp(s1,s2)==0)
{
flag=1;
}
else
{
strcpy(c[1],s1);
strcpy(c[2],s2);
m=3;
}
for(i=0; i<=150; i++)
for(j=0; j<=150; j++)
{
map[i][j]=inf;
}
for(i=1; i<=n; i++)
{
cin>>s1>>s2>>w;
if(flag==0)
{
u=find(s1);
v=find(s2);
// cout<<u<<s1<<endl;
if(w<map[u][v])
{
map[u][v]=w;
map[v][u]=w;
}
}
}
if(flag==1) cout<<0<<endl;
// cout<<s1<<endl;
else
cout<<dijie(1,2)<<endl;
}
return 0;
}