日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【最短路】【SPFA】电车 (luogu 1346)

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【最短路】【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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。