洛谷P1346 電車|最短路徑|重新建圖
阿新 • • 發佈:2018-11-19
目錄
題目描述
思路
最短路水題
根據題意:
對於每個車站:
第一個出度的車站的權值為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; }