• 【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.

    个人博客地址: www.moyujiang.com 或 moyujiang.top
  • 相关阅读:
    Coding 账户与 本地 Git 客户端的配置
    leetcode_sort-list
    leetcode_insertion-sort-list
    leetcode_move-zeroes
    search-insert-position
    leetcode_remove-nth-node-from-end-of-list
    leetcode_queue-reconstruction-by-height
    leetcode_valid-parentheses
    leetcode_swap-nodes-in-pairs
    20201115-东北师范大学-助教-周总结-第9次
  • 原文地址:https://www.cnblogs.com/moyujiang/p/11167790.html
Copyright © 2020-2023  润新知