洛谷P1346 电车

P1346 电车

题目描述
在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能)。在每个路口,都有一个开关决定着出去的轨道,每个开关都有一个默认的状态,每辆电车行驶到路口之后,只能从开关所指向的轨道出去,如果电车司机想走另一个轨道,他就必须下车切换开关的状态。

为了行驶向目标地点,电车司机不得不经常下车来切换开关,于是,他们想请你写一个程序,计算一辆从路口 A A 到路口 B B 最少需要下车切换几次开关。


输入格式
第一行有 3 3 个整数 2 < = N < = 100 2<=N<=100 1 < = A 1<=A B < = N B<=N ,分别表示路口的数量,和电车的起点,终点。

接下来有 N N 行,每行的开头有一个数字 K i ( 0 < = K i < = N 1 ) Ki(0<=Ki<=N-1) ,表示这个路口与 K i Ki 条轨道相连,接下来有 K i Ki 个数字表示每条轨道所通向的路口,开关默认指向第一个数字表示的轨道。

输出格式
输出文件只有一个数字,表示从 A A B B 所需的最少的切换开关次数,若无法从 A A 前往 B B ,输出 1 -1


输入输出样例

输入 #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;
}
发布了73 篇原创文章 · 获赞 5 · 访问量 1833

猜你喜欢

转载自blog.csdn.net/kejin2019/article/details/103999457
今日推荐