题目描述
放暑假了,勤奋同学想去大都市走走,开阔一下自己的眼界。但他对当地的交通还是不太了解。
有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车。
看着他那迷茫而又无助的眼神,作为助人为乐的你能帮帮他吗?
请帮助他用最短的时间到达目的地(假设每一路公交车都只在起点站和终点站停,而且随时都会开,站点数不会超过150个)
输入
第一行是公交车线路的总数N(0<=N<=10000);
第二行有勤奋同学的所在地start,他的目的地end;
接着有n行,每行有站名s,站名e,以及从s到e的时间整数t(0< t <100)(每个地名是一个长度不超过30的字符串)。
输出
如果勤奋同学能到达目的地,输出最短的时间;否则,输出“-1”。
样例输入
6
xiasha westlake
xiasha station 60
xiasha ShoppingCenterofHangZhou 30
station westlake 20
ShoppingCenterofHangZhou supermarket 10
xiasha supermarket 50
supermarket westlake 10
样例输出
50
提示:迪杰斯特拉+普通队列
#include<bits/stdc++.h>
#define quickly() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define P 10010
#define sd(n,m) memset(n,m,sizeof(n))
#define exc(n,x,y,u) n[x][y]=n[y][x]=u
#define ppn(digits,n) next_permutation(digits,digits+n)
using namespace std;
struct edge{
int v,w;
bool operator<(edge b)const{
return w>b.w;
}
};vector<edge> es[P];
int dis[P],vis[P];
//template<class T>
void dijkstra(int s){
sd(dis,0x3f);
dis[s]=0;
priority_queue<edge> q;
q.push({s,0});
while(!q.empty()){
edge now=q.top();
q.pop();
if(vis[now.v]==1)continue;
vis[now.v]=1;
int len=es[now.v].size();
for(int i=0;i<len;i++){
edge tmp=es[now.v][i];
if(dis[now.v]+tmp.w<dis[tmp.v]){
dis[tmp.v]=dis[now.v]+tmp.w;
q.push({tmp.v,dis[tmp.v]});
}
}
}
}int n;
string st,ed;
map<string,int>mp;
int main(){
quickly();
cin>>n>>st>>ed;
mp[st]=1,mp[ed]=2;
int id=3;
for(int i=1;i<=n;i++){
string u,v;
int w;
cin>>u>>v>>w;
if(!mp[u])mp[u]=id++;
if(!mp[v])mp[v]=id++;
es[mp[u]].push_back({mp[v],w});
es[mp[v]].push_back({mp[u],w});
}dijkstra(1);
if(dis[2]==0x3f3f3f3f)cout<<-1;
else cout<<dis[2];
}