本题我是用优先队列优化的迪杰斯特拉算法,算作练手题。
思路::基本算法,是dijstra算法,注意此题是无向图,题目中没有说明,起点到终点可能是同一个站,此时输出0,不能到达两地输出 -1 , 起点 –> 终点可能不存在公交车。
#include <iostream>
#include <string.h>
#include <queue>
#include <algorithm>
using namespace std;
char name[10009][200],str1[200],str2[200];
int cnn,n,line,a,b,map[200][200],dis[200];
struct sb
{
int first,second;
bool operator<(const sb &t)const
{
if(first!=t.first)
return first>t.first;
else
return second>t.second;
}
};
int find(char *str)
{
int flag=0,i;
for(i=1;i<=cnn;i++)
{
if(!strcmp(name[i],str))
{
flag=1;
return i;
break;
}
}
if(!flag)
{
cnn++;
strcpy(name[cnn-1],str);
return cnn-1;
}
}
priority_queue<sb>q;
int main()
{
int i;
while(cin>>n)
{
memset(dis,9,sizeof(dis));
memset(map,-1,sizeof(map));
if(n==-1)
break;
cnn=1;
scanf("%s",name[cnn++]);
scanf("%s",name[cnn++]);
for(i=1;i<=n;i++)
{
cin>>str1>>str2>>line;
a=find(str1);
b=find(str2);
if(line<map[a][b]||map[a][b]<0)
{
map[a][b]=line;
map[b][a]=line;
}
}
if(!strcmp(name[1],name[2]))
{
cout<<0<<endl;
continue;
}
dis[1]=0;
sb e={dis[1],1};
q.push(e);
while(!q.empty())
{
e=q.top();
q.pop();
int x=e.second;
if(e.first!=dis[x])
continue;
for(i=1;i<cnn;i++)
{
if(map[x][i]>0&&dis[i]>dis[x]+map[x][i])
{
dis[i]=dis[x]+map[x][i];
sb e1={dis[i],i};
q.push(e1);
}
}
}
if(dis[2]>10000000)
{
cout<<-1<<endl;
continue;
}
cout<<dis[2]<<endl;
}
return 0;
}