全体集合(牛客)


分析:
该题仅仅只是判断能否集合,发现如果俩个点距离差为奇数,则可以,距离差为偶数,则不行
无向图保证连通,则有可能两个点有多条路径可以走,换个说法可能会有环
则可能会有一种情况,a->b有一条路径为奇数,有一条路径为偶数
那么其他点无论怎么样都可以满足与a,b两点集合
因为:假如一个点距离a为奇数,那么a就可以与他集合,如果距离a为偶数,那么他距离b点就为奇数,可以与b集合
a和b肯定是可以集合,所以整个图都可以集合。
如果没有奇偶环的话(两点路径奇偶唯一),直接遍历一遍整个图,如果有存在偶数的一定不成立

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;

int n,m,k;
vector<int>e[N];

int col[N],op;

void dfs(int u){
	for(auto v:e[u]){
		if(col[v]&&col[v]==col[u]) op=1;
		if(!col[v]) col[v]=-col[u],dfs(v);
	}
}

int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1,u,v;i<=m;i++){
		scanf("%d%d",&u,&v);
		e[u].push_back(v),e[v].push_back(u);
	}
	col[1]=1;
	dfs(1);
	if(op==1) return puts("YES")&0;
	int a1,s;
	scanf("%d",&a1);
	for(int i=2;i<=k;i++) {
		scanf("%d",&s);
		if(col[s]!=col[a1]) op=1;
	}
	puts(op?"NO":"YES");
	return 0;
}
posted @ 2022-01-16 20:16  wzx_believer  阅读(95)  评论(0编辑  收藏  举报