【最短路】【SPFA】电车 (luogu 1346)
生活随笔
收集整理的這篇文章主要介紹了
【最短路】【SPFA】电车 (luogu 1346)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
電車
luogu 1346
題目大意:
有n個點,要從一個點到另一個點,每個點連接著其他ai個點,到連接的第一個點路徑長度為0,其他長度為1,求最短路
題目描述
在一個神奇的小鎮上有著一個特別的電車網絡,它由一些路口和軌道組成,每個路口都連接著若干個軌道,每個軌道都通向一個路口(不排除有的觀光軌道轉一圈后返回路口的可能)。在每個路口,都有一個開關決定著出去的軌道,每個開關都有一個默認的狀態,每輛電車行駛到路口之后,只能從開關所指向的軌道出去,如果電車司機想走另一個軌道,他就必須下車切換開關的狀態。
為了行駛向目標地點,電車司機不得不經常下車來切換開關,于是,他們想請你寫一個程序,計算一輛從路口A到路口B最少需要下車切換幾次開關。
輸入輸出格式
輸入格式:
第一行有3個整數2<=N<=100,1<=A,B<=N,分別表示路口的數量,和電車的起點,終點。
接下來有N行,每行的開頭有一個數字Ki(0<=Ki<=N-1),表示這個路口與Ki條軌道相連,接下來有Ki個數字表示每條軌道所通向的路口,開關默認指向第一個數字表示的軌道。
輸出格式:
輸出文件只有一個數字,表示從A到B所需的最少的切換開關次數,若無法從A前往B,輸出-1。
輸入輸出樣例
輸入樣例#1:
3 2 1 2 2 3 2 3 1 2 1 2輸出樣例#1:
0解題思路
直接用鄰接矩陣存,每一次把連接的第一個點和其他點分開處理,在特判一下就可以了
代碼:
#include<cstdio> #include<cstring> #include<iostream> #include<queue> using namespace std; int n,a1,b1,now,q,b[105],p[105],a[105][105]; int main() {scanf("%d %d %d",&n,&a1,&b1);for (int i=1;i<=n;++i){scanf("%d",&a[i][0]);//個數for (int j=1;j<=a[i][0];++j)scanf("%d",&a[i][j]);}memset(b,127/3,sizeof(b));//預處理q=b[1];//記下來b[a1]=0;//初值p[a1]=1;//記錄queue<int>d;d.push(a1);while(!d.empty()){now=d.front();//取出來d.pop(); if (now)//是否有相連的點{if (b[now]<b[a[now][1]])//更優{b[a[now][1]]=b[now];//代替if (!p[a[now][1]])//不在隊列{p[a[now][1]]=1;//記錄d.push(a[now][1]);//入隊}}}for (int i=2;i<=a[now][0];++i)if (b[now]+1<b[a[now][i]])//加一{b[a[now][i]]=b[now]+1;//同上if (!p[a[now][i]]){p[a[now][i]]=1;d.push(a[now][i]);}}p[now]=0;//清零} if (b[b1]==q) printf("-1");//特判else printf("%d",b[b1]); }總結
以上是生活随笔為你收集整理的【最短路】【SPFA】电车 (luogu 1346)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你真的需要一台投影仪了你真的需要一台投影
- 下一篇: 【SPFA】最优贸易(luogu 107