首页 > 其他 > 详细

洛谷P1346 电车|最短路径|重新建图

时间:2018-11-19 18:33:36      阅读:183      评论:0      收藏:0      [点我收藏+]

目录

题目描述

技术分享图片

思路

最短路水题
根据题意:
对于每个车站:
第一个出度的车站的权值为0
其余的权值为1
根据以上描述建图即可

代码

#include <cstdio>
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
#define inf 999999
using namespace std;
void read(int &n){
    int num=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        num=num*10+ch-'0';
        ch=getchar();
    }
    n=num*w;
}
const int maxn=105;
struct node{int v,w;};
vector<node> g[maxn];
int n,a,b;
void init(){
    read(n);read(a);read(b);
    for(int u=1;u<=n;u++){
        int k;read(k);
        for(int i=1;i<=k;i++){
            int v;read(v);
            g[u].push_back((node){v,i==1?0:1});
        }
    }
}
int dist[maxn],done[maxn];
void Dijkstra(int s){
    for(int i=1;i<=n;i++) dist[i]=inf;
    memset(done,0,sizeof(done));
    dist[s]=0;
    priority_queue<pair<int,int> >q;
    q.push(make_pair(0,s));
    while(!q.empty()){
        int u=q.top().second;q.pop();
        if(done[u]) continue;
        done[u]=1;
        for(int i=0;i<g[u].size();i++){
            int v=g[u][i].v,w=g[u][i].w;
            if(dist[v]>dist[u]+w){
                dist[v]=dist[u]+w;
                q.push(make_pair(-dist[v],v));
            }
        }
    }
}
int main(){
    init();
    Dijkstra(a);
    printf("%d",dist[b]!=inf?dist[b]:-1);
    return 0;
}

洛谷P1346 电车|最短路径|重新建图

原文:https://www.cnblogs.com/saitoasuka/p/9984452.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!