1. 程式人生 > >洛谷P1346 電車|最短路徑|重新建圖

洛谷P1346 電車|最短路徑|重新建圖

目錄

題目描述

電車 題目描述

思路

最短路水題
根據題意:
對於每個車站:
第一個出度的車站的權值為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;
}