题目大意:
就是将所有公交站的站名和公交站之间的时间告诉你,要你求两个站之间所需要花费的最少的时间。其实本题还是一个最短路问题,不同之处就是站点是以字符串的形式给出的,可以用map存键值对的形式来解!
spfa求最短路,加优先级队列优化时间!
#include<stdio.h>
#include<map>
#include<string.h>
#include<string>
#include<queue>
#include<vector>
#define N 10009
#define inf 1<<31-1
using namespace std;
struct node{
int dis;
int to;
};
int dis[N];
struct cmp{
bool operator()(const int x,const int y)
{
return dis[x]>dis[y];
}
};
map<string ,int >v;
vector<node>G[N];
bool in_s[N];
void spfa(int st,int n,int ed){
priority_queue<int,vector<int>,cmp>s;
int i,j,si,ui,di;
for(i=0;i<=n;i++){
dis[i]=inf;
in_s[i]=false;
}
s.push(st);
in_s[st]=true;
dis[st]=0;
while(!s.empty()){
si=s.top();
s.pop();
in_s[si]=false;
for(i=0;i<G[si].size();i++){
ui=G[si][i].to;
di=G[si][i].dis;
if(dis[ui]>dis[si]+di){
dis[ui]=dis[si]+di;
if(!in_s[ui]){
s.push(ui);
in_s[ui]=true;
}
}
}
}
}
int main()
{
char a[35],b[35];
int n,st,ed,vi,d,i,v1,v2;
node temp;
while(scanf("%d",&n)&&n!=-1){
vi=0;
v.clear();
for(i=0;i<=n;i++)
G[i].clear();
scanf("%s %s",a,b);
v[a]=++vi;st=vi;
if(v.find(b)==v.end()){
v[b]=++vi;ed=vi;
}else{
ed=v[b];
}
for(i=1;i<=n;i++){
scanf("%s %s %d",a,b,&d);
if(v.find(a)==v.end()){
v[a]=++vi;v1=vi;
}else{
v1=v[a];
}
if(v.find(b)==v.end()){
v[b]=++vi;v2=vi;
}else{
v2=v[b];
}
temp.dis=d;
temp.to=v2;
G[v1].push_back(temp);
temp.to=v1;
G[v2].push_back(temp);
}
spfa(st,vi,ed);
if(dis[ed]!=inf){
printf("%d\n",dis[ed]);
}else{
puts("-1");
}
}
}