題目描述
在一個神奇的小鎮上有着一個特別的電車網絡,它由一些路口和軌道組成,每個路口都連接着若干個軌道,每個軌道都通向一個路口(不排除有的觀光軌道轉一圈後返回路口的可能)。在每個路口,都有一個開關決定着出去的軌道,每個開關都有一個默認的狀態,每輛電車行駛到路口之後,只能從開關所指向的軌道出去,如果電車司機想走另一個軌道,他就必須下車切換開關的狀態。
爲了行駛向目標地點,電車司機不得不經常下車來切換開關,於是,他們想請你寫一個程序,計算一輛從路口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
分析&說明:
這道題數據水:N<=100.所以可以用 FLOYED 做。這道題主體算法部分可以說是模板,就是輸入奇妙,注意一下就好了。
代碼實現:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,a,b,c,to,dis[110][110];
int main()
{
cin>>n>>a>>b;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
dis[i][j]=1e+7; //初始值賦大一些
dis[i][i]=0; //自身爲0
}
for(int i=1;i<=n;i++)
{ //神奇輸入
cin>>c;
for(int j=1;j<=c;j++)
{
cin>>to;
if(j==1) dis[i][to]=0;
else dis[i][to]=1; //判斷連通
}
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) //FLOYED
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
if(dis[a][b]==1e+7) //答案是否合理
cout<<"-1";
else cout<<dis[a][b]; //合法即輸出
return 0;
}