【bfs】单向公路-C++

本文深入解析了BFS(广度优先搜索)算法在有向图中的应用,通过一个具体的编程实例,详细介绍了如何使用BFS算法来判断两个城镇间是否存在路径。文章提供了完整的AC代码,帮助读者理解并掌握BFS算法的实现细节。
描述

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

转载于:https://www.cnblogs.com/moyujiang/p/11167790.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值