题解:CF1470D Strange Housing
首先如果原图不连通显然不合法,否则我们有一个显然的想法:从一个点开始 DFS,如果一个点周围没有点被染色,就将它染色。
为什么这样是对的呢?每个点有两种情况:
- 这个点被染色,那么它一定和其父亲联通,而父亲未被染色,所以它一定与另一个被染色的点联通。
- 否则,它显然也一定与一个染色了的点联通。
于是根据归纳法,因为起点会被染色,所有染色点都会与起点联通,所以这样做就是对的了。
Code:
#include<iostream>
#include<vector>
#define rep(i,l,r) for(int i=(l);i<=(r);i++)
#define per(i,l,r) for(int i=(l);i>=(r);i--)
using namespace std;
const int maxn=3e5+5;
vector<int> G[maxn];
bool col[maxn],vis[maxn];
int ans;
inline void dfs(int cur){
vis[cur]=col[cur]=true;
for(int v:G[cur])col[cur]&=!col[v];
if(col[cur])ans++;
for(int v:G[cur])if(!vis[v])dfs(v);
}
int main(){
int it;
cin>>it;
while(it--){
int in,im;
scanf("%d %d",&in,&im);
ans=0;
rep(v1,1,in){
G[v1].clear();
col[v1]=vis[v1]=false;
}
rep(v1,1,im){
int iu,iv;
scanf("%d %d",&iu,&iv);
G[iu].push_back(iv);
G[iv].push_back(iu);
}
dfs(1);
bool flag=true;
rep(v1,1,in){
if(!vis[v1]){
flag=false;
break;
}
}
if(flag){
printf("YES\n%d\n",ans);
rep(v1,1,in)if(col[v1]){
if(v1!=1)printf(" ");
printf("%d",v1);
}
printf("\n");
}
else printf("NO\n");
}
return 0;
}

浙公网安备 33010602011771号