洛谷P2189小Z的传感器

刷题之路-图论

洛谷P2189小Z的传感器

传送门

题目描述

在这里插入图片描述

做题思路

非常傻的一种做法。
从起点开始,将起点所能到达的点加入集合中,如果能到达的点没有传感器,那就对其进行深搜,将每一个能从它到达的且没有传感器的点放入集合中。然后对第二个点进行判断,若存在于集合中,则将该点作为起点,重复上述过程,若不存在,则说明顺序不对,返回No。重复上述过程,直至遍历所有点。

代码

#include<iostream>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<functional>
#include<cmath>
#include<cstdlib>
using namespace std;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
typedef pair<int, int> pii;
typedef long long ll;
const int N = 100005;
const int M = 200005;
int a[N];
bool has[N];	//判断是否有传感器
struct edge
{
    
    
	int v, next;
}e[M * 2];
int eid, p[N], n, m, k;
void init()
{
    
    
	eid = 0;
	memset(p, -1, sizeof p);
}
void insert(int u, int v)
{
    
    
	e[eid].v = v;
	e[eid].next = p[u];
	p[u] = eid++;
}
set<int>s;	//存储当前可到达的所有点
bool st[N];	//判断是否访问,好像没什么用
void dfs(int u)		//深搜,将所有可到达的无传感器的点加入集合
{
    
    
	st[u] = 1;
	for (int i = p[u]; i + 1; i = e[i].next)
	{
    
    
		int v = e[i].v;
		s.insert(v);
		if (!st[v] && !has[v]) dfs(v);
	}
}
bool bfs(int u)
{
    
    
	s.clear();
	memset(st, 0, sizeof st);

	//将起点的能到的点放入集合
	for (int i = p[u]; i + 1; i = e[i].next)
	{
    
    
		s.insert(e[i].v);
		if (!has[e[i].v]) dfs(e[i].v);
	}
	int num = 1;
	while (num < k)
	{
    
    
		//cout << num << endl;
		if (s.count(a[num]))	//若存在,则以该点为起点深搜
		{
    
    
			for (int i = p[a[num]]; i + 1; i = e[i].next)
			{
    
    
				int v = e[i].v;
				if (!s.count(v))
				{
    
    
					s.insert(v);
					if (!has[v] && !st[v]) dfs(v);
				}
			}
			num++;
		}
		else return 0;//不存在则返回0
	}
	return 1;
}



int main()
{
    
    
	init();
	int q;
	scanf("%d%d%d%d", &n, &m, &k, &q);
	for (int i = 0; i < m; i++)
	{
    
    
		int u, v;
		scanf("%d%d", &u, &v);
		insert(u, v);
		insert(v, u);
	}

	for (int j = 0; j < q; j++)
	{
    
    
		if (j == 0)	//第一次需要进行判断哪些点有传感器
		{
    
    
			for (int i = 0; i < k; i++)
			{
    
    
				scanf("%d", &a[i]);
				has[a[i]] = 1;
			}
		}
		else for (int i = 0; i < k; i++) scanf("%d", &a[i]);
		if (bfs(a[0])) puts("Yes");
		else puts("No");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_50119246/article/details/114397779