【J2】乘公交

题目描述

放暑假了,勤奋同学想去大都市走走,开阔一下自己的眼界。但他对当地的交通还是不太了解。
有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车。
看着他那迷茫而又无助的眼神,作为助人为乐的你能帮帮他吗?
请帮助他用最短的时间到达目的地(假设每一路公交车都只在起点站和终点站停,而且随时都会开,站点数不会超过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];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值