全体集合(牛客)
分析:
该题仅仅只是判断能否集合,发现如果俩个点距离差为奇数,则可以,距离差为偶数,则不行
无向图保证连通,则有可能两个点有多条路径可以走,换个说法可能会有环
则可能会有一种情况,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;
}