題目提供者yeszy
標籤圖論福建省歷屆夏令營
難度普及/提高-
提交該題 討論 題解 記錄
在乙個神奇的小鎮上有著乙個特別的電車網路,它由一些路口和軌道組成,每個路口都連線著若干個軌道,每個軌道都通向乙個路口(不排除有的觀光軌道轉一圈後返回路口的可能)。在每個路口,都有乙個開關決定著出去的軌道,每個開關都有乙個預設的狀態,每輛電車行駛到路口之後,只能從開關所指向的軌道出去,如果電車司機想走另乙個軌道,他就必須下車切換開關的狀態。
為了行駛向目標地點,電車司機不得不經常下車來切換開關,於是,他們想請你寫乙個程式,計算一輛從路口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 12 2 3
2 3 1
2 1 2
輸出樣例#1:
0分析:我一開始以為用二分做,但是一想又不需要,因為是求乙個點到另乙個點的最少的切除開關次數,可以把這個次數看作最短路,那麼如果u的開關不指向路徑v,那麼就從u向v連一條權值為1的有向邊,否則權值為0,那麼就用spfa解決?觀察資料會發現n非常小,這個時候用floyd演算法就能很快解決.
#include #include#include
#include
using
namespace
std;
int d[110][110
];int
n, a, b;
const
int inf = 100000000
;int
main()
}for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (d[i][j] > d[i][k] + d[k][j] && d[i][k] != inf && d[k][j] !=inf)
d[i][j] = d[i][k] +d[k][j];
if (d[a][b] ==inf)
printf(
"-1\n");
else
printf(
"%d\n
", d[a][b]);
return0;
}
洛谷 P1346 電車
稍微包裝過一下的最短路。如果初始狀態就是到達那個路口,就把權值搞為0,如果不是就搞為1 然後跑最短路,我用的是spfa,不過100的資料怎麼跑都行吧。include includeusing namespace std const int maxn 100 int n,a,b,k,map maxn ...
洛谷 P1346 電車
題目描述 在乙個神奇的小鎮上有著乙個特別的電車網路,它由一些路口和軌道組成,每個路口都連線著若干個軌道,每個軌道都通向乙個路口 不排除有的觀光軌道轉一圈後返回路口的可能 在每個路口,都有乙個開關決定著出去的軌道,每個開關都有乙個預設的狀態,每輛電車行駛到路口之後,只能從開關所指向的軌道出去,如果電車...
洛谷P1346 電車
在乙個神奇的小鎮上有著乙個特別的電車網路,它由一些路口和軌道組成,每個路口都連線著若干個軌道,每個軌道都通向乙個路口 不排除有的觀光軌道轉一圈後返回路口的可能 在每個路口,都有乙個開關決定著出去的軌道,每個開關都有乙個預設的狀態,每輛電車行駛到路口之後,只能從開關所指向的軌道出去,如果電車司機想走另...