P1346 电车
题目描述
在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能)。在每个路口,都有一个开关决定着出去的轨道,每个开关都有一个默认的状态,每辆电车行驶到路口之后,只能从开关所指向的轨道出去,如果电车司机想走另一个轨道,他就必须下车切换开关的状态。
为了行驶向目标地点,电车司机不得不经常下车来切换开关,于是,他们想请你写一个程序,计算一辆从路口 到路口 最少需要下车切换几次开关。
输入格式
第一行有
个整数
,
,
,分别表示路口的数量,和电车的起点,终点。
接下来有 行,每行的开头有一个数字 ,表示这个路口与 条轨道相连,接下来有 个数字表示每条轨道所通向的路口,开关默认指向第一个数字表示的轨道。
输出格式
输出文件只有一个数字,表示从
到
所需的最少的切换开关次数,若无法从
前往
,输出
。
输入输出样例
输入 #1
3 2 1
2 2 3
2 3 1
2 1 2
输出 #1
0
解题思路
这是一道板子题。。。这是事实
代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iomanip>
using namespace std;
int k,q[100000],v[100000],dis[100000],h,t,head[100000],n,a,b;
struct c{
int x,w,next;
}bsy[100000];
void spfa(int a){
memset(dis,0X7f,sizeof(dis));
q[1]=a;
v[a]=1;
dis[a]=0;
h=0;t=1;
while(h<t)
{
h++;
for(int i=head[q[h]];i;i=bsy[i].next)
{
if(dis[q[h]]+bsy[i].w<dis[bsy[i].x])
{
dis[bsy[i].x]=dis[q[h]]+bsy[i].w;
if(!v[bsy[i].x])
{
v[bsy[i].x]=1;
t++;
q[t]=bsy[i].x;
}
}
}
v[q[h]]=0;
}
}
int main(){
int x,y;
scanf("%d%d%d",&n,&a,&b);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
for(int j=1;j<=x;j++)
{
scanf("%d",&y);
k++;
bsy[k].x=y;
if(j==1)
bsy[k].w=0;
else
bsy[k].w=1;
bsy[k].next=head[i];
head[i]=k;
}
}
spfa(a);
if(dis[b]!=dis[0])
cout<<dis[b];
else
cout<<-1;
}