列表

详情


NC229450. D 与 S

描述

S 在追杀 D。
现在,D 在一张有 NM 边的无向图的 1 号点。
每一秒,S 会剪掉与 D 相邻的一条边,然后 D 会走到一条没被剪掉的边的终点。
K 个关键点,如果 D 到达了其中一个关键点,则 D 逃跑成功。S 要尽可能地阻止 D 逃跑成功。
你需要回答:若 S 绝顶聪明,D 能不能逃跑成功。注意,如果 D 一开始就处在关键点,也算做他逃跑成功。

输入描述

第一行包含一个数 T),表示询问组数。
对于每组数据,第一行三个整数 N,M,K)。
第二行 K 个正整数,表示关键点。
接下来 M 行 ,每行两个正整数 u,v,表示存在 (u,v) 这条无向边。
保证关键点两两不同,且编号小于等于 N 。
保证所有询问的 N 之和与 M 之和都不超过 
保证数据中不存在重边与自环。

输出描述

对于每组数据输出一行,若 D 可以走到关键点,则输出 yes;否则,输出 no。

示例1

输入:

1
5 6 2
3 4
1 2
1 3
2 3
3 4
5 4
1 5

输出:

no

示例2

输入:

1
3 2 2
2 3
1 2
1 3

输出:

yes

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 273ms, 内存消耗: 25920K, 提交时间: 2022-08-25 19:44:33

#include <bits/stdc++.h>
using namespace std;
#define N 500005
int T, n, m, k, x, y, f[N];
queue<int> q;
vector <int> g[N];
bool v[N];
int main()
{
	scanf("%d", &T);
	while(T--)
	{
		scanf("%d%d%d", &n, &m, &k);
		for(int i = 1; i <= n; i++)
			g[i].clear();
		memset(f, 0, sizeof(f));
		memset(v, 0, sizeof(v));
		for(int i = 1; i <= k; i++)
		{
			scanf("%d", &x);
			q.push(x);
			v[x] = 1;
		}
		for(int i = 1; i <= m; i++)
		{
			scanf("%d%d", &x, &y);
			g[x].push_back(y);
			g[y].push_back(x);
		}
		while(!q.empty())
		{
			x = q.front();
			q.pop();
			for(int i = 0; i < g[x].size(); i++)
			{
				y = g[x][i];
				if(v[y])  continue;
				if(++f[y] >= 2)
				{
					v[y] = 1;
					q.push(y);
				}
			}
		}
		printf(v[1] ? "yes\n" : "no\n");
	}
	return 0;
}

C++ 解法, 执行用时: 228ms, 内存消耗: 24640K, 提交时间: 2021-12-04 18:42:31

#include<bits/stdc++.h>
using namespace std;

vector<int>R[500005];
int Q[500005],cnt[500005];
bool V[500005];
int main()
{
	int i,j,n,m,t,r,f,x,T;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%d",&n,&m,&t),r=f=0;
		for(i=1;i<=n;i++)R[i].clear(),cnt[i]=V[i]=0;
		while(t--)
		{
			scanf("%d",&x);
			V[x]=cnt[x]=1,Q[r++]=x;
		}
		while(m--)scanf("%d%d",&i,&j),R[i].push_back(j),R[j].push_back(i);
		while(r!=f)
		{
			x=Q[f++];
			for(i=0;i<R[x].size();i++)
			{
				j=R[x][i],cnt[j]++;
				if(cnt[j]>=2&&!V[j])V[j]=1,Q[r++]=j;
			}
		}
		if(V[1])puts("yes");
		else puts("no");
	}
    return 0;
}

上一题