【bfs】单向公路-C++

描述

某地区有许多城镇,但并不是每个城镇都跟其他城镇有公路连接,并且有的公路并不能双向行驶。现在我们把这些城镇间的公路分布及允许的行驶方向告诉你,你需要编程解决通过公路是否可以从一个城镇到达另一个城镇。(我们规定,城镇自己跟自己可互相到达,即 a 可到达 a)。


输入
第一行只有一个数 N ,下面将跟着 2N 行数据。

在前 N 行数据中,每行数据开头第一个数字 number,表明这一行总共有 number个数, number的下一个数为 i ,代表编号为 i 的城镇。这行余下的就是跟 i 有公路连接的城镇名单,并且只能从城镇 i 驶向其他城镇。如 4 1 2 3,表明:此行有 4 个数,跟城镇 1 有公路连接的城镇是编号为 2 和 3 的城镇,且只允许从城镇 1驶向城镇 2 和 3 ,而不能从 2 到 1 或 3 到 1。

在后 N 行数据中,每行由两个数字组成 a , b。

对于每个输入的数有如下关系 0≤input_number≤1000。


输出
对于输入数据中的每个 a,b,判断是否可以从城镇 a 通过公路到达城镇 b,如果可以,输出 Yes;否则输出No。


输入样例 1 

3
4 1 2 3
3 4 5
3 5 8
1 2
1 8
4 8
输出样例 1

Yes
No
Yes

这道题采用的是Bfs,不懂的看这里
读完题目,不难发现就是一个有向图里的判断是否连通。那么就采用广搜,每次的起点和终点分别是询问的起始点和终止点,注意每次搜索之前要清空vis数组与队列!
坑点:题目没说编号分别从1-n,所以要在输入的时候记录最大的编号以便于搜索(懒得开数组记录)
其他的基本就是最最普通的bfs模板,主要就是练习打bfs的熟练度。。总体来说是一道很好的bfs入门题目!

AC代码

#include<bits/stdc++.h>
using namespace std;
bool G[1001][1001];
bool vis[1001];
int n,a,b,num,maxi=-1;
void init()
{
	for(int i=1;i<=1000;i++)
	{
		G[i][i]=1;//我套我自己 
	}
}
queue<int> q;
void qinit()
{
	while(!q.empty())
	{
		q.pop();
	}
}
bool bfs(int a,int b)
{
	qinit();
	memset(vis,0,sizeof(vis));
	vis[a]=1;
	q.push(a);
	while(!q.empty())
	{
		int now=q.front();
		for(int i=1;i<=maxi;i++)
		{
			if(G[now][i]&&!vis[i])
			{
				q.push(i);
				vis[i]=1;
				if(i==b)
				{
					return true;
				} 
			}
		}
		q.pop();
	}
	return false;
}
int main()
{
	cin>>n;
	init();
	for(int i=1;i<=n;i++)
	{
		cin>>num;
		cin>>a;
		for(int j=3;j<=num;j++)
		{
			cin>>b;
			G[a][b]=1;
			maxi=max(maxi,max(a,b));
		}
	}
	for(int i=1;i<=n;i++)
	{
		
		cin>>a>>b;
		if(bfs(a,b))cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
	return 0;
}

ov.

posted @ 2019-06-01 16:24  摸鱼酱  阅读(222)  评论(0编辑  收藏  举报