WA on 7 求条,悬关
查看原帖
WA on 7 求条,悬关
1060759
qw1234321楼主2024/5/2 19:25
#include<bits/stdc++.h>
#define int long long
#define il inline
namespace things{
	il int rd(){
		int f = 1, x = 0;
		char ch = getchar();
		while(ch < '0' || ch > '9'){
			if (ch == '-') f = -1;
			ch = getchar();
		}
		while(ch >= '0' && ch <= '9'){
			x = x * 10 + ch - '0';
			ch = getchar();
		}
		return x * f;
	}
}
using namespace things;
using namespace std;

const int N = 2e5 + 5, M = 4e5 + 5, INF = 0x3f3f3f3f;
int n, m, p, b, ok[N], st[N];
struct node{
	int to, next;
}e[M];
int pre[M], k, dis[N], ans[N], sum;
//bool vis[N];
map<int, int> mp;

void add(int u, int v){
	e[++k] = {v, pre[u]};
	pre[u] = k;
}

queue<int> q;
void bfs(int s){
	q.push(s);
	dis[s] = 0;
//	vis[s] = 1;
	while(q.size()){
		int u = q.front();
		q.pop();
		for (int i = pre[u]; i; i = e[i].next){
			int v = e[i].to;
			if (dis[v] > dis[u] + 1 && (u == 1 || ok[u])){
				dis[v] = dis[u] + 1;
//				vis[v] = 1;
				q.push(v);
			}
		}
	}
}

int calc(int u){
	if (ok[u]){
		for (int i = pre[u]; i; i = e[i].next){
			int v = e[i].to;
			if (ok[v]) return INF;
		}
	}
	else{
		for (int i = pre[u]; i; i = e[i].next){
			int v = e[i].to;
			if (ok[v]){
				for (int j = pre[v]; j; j = e[j].next){
					int w = e[j].to;
					if (ok[w]) return INF;
				}
				return 1;
			}
		}
	}
	return 0;
}

il void work(){
	n = rd(), m = rd(), p = rd(), b = rd();
	for (int i = 1; i <= n; i++) dis[i] = INF, ok[i] = pre[i] = sum = 0;
	k = 0, mp.clear();
	for (int i = 1; i <= p; i++) st[i] = rd(), mp[st[i]] = 1;
	for (int i = 1, x; i <= b; i++){
		x = rd();
		ok[x] = 1;
	}	
	for (int i = 1, u, v; i <= m; i++){
		u = rd(), v = rd();
		add(u, v), add(v, u);
	}
	bfs(1);
	for (int i = 1; i <= p; i++) ans[st[i]] = calc(st[i]), sum += ans[st[i]];
	for (int i = 1; i <= p; i++){
		if (dis[st[i]] < INF && dis[st[i]] - 1 <= sum - ans[st[i]]){
			cout << "YES\n";
			return ;
		}
	}
	cout << "NO\n";
}

signed main(){
	int t = 1;
	t = rd();
	while(t--) work();
	return 0;
}
2024/5/2 19:25
加载中...