题解:CF1470D Strange Housing

Luogu CF

首先如果原图不连通显然不合法,否则我们有一个显然的想法:从一个点开始 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;
}
posted @ 2025-07-21 19:09  FugiPig  阅读(5)  评论(0)    收藏  举报