Codeforces Round #565 (Div. 3) E. Cover it! (dfs染色法)

题目链接在这里插入图片描述
在这里插入图片描述
题意:给定一个有向图,要你选择一个不超过n/2个点的集合,使得他们能连上图的所有点。
思路:用dfs染色法,相邻的点涂上不同颜色,判断一下颜色数小于n/2的点输出来就行了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+1;
int color[maxn];
vector<int>g[maxn];
void dfs(int u,int fa,int last)
{
	color[u]=last;
	if(last==1) last=2;
	else last=1;
	for(int to:g[u])
	{
		if(!color[to]) dfs(to,u,last);
	}
}
int main()
{
	int T,n,m,u,v;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;++i) g[i].clear(),color[i]=0;
		for(int i=1;i<=m;++i)
		{
			scanf("%d%d",&u,&v);
			g[u].push_back(v);
			g[v].push_back(u);
		}
		dfs(1,0,1);
		int cnt=0;
		for(int i=1;i<=n;++i) if(color[i]==1) cnt++;
		int t=(cnt<=n/2)?1:2,ans=(cnt<=n/2)?cnt:n-cnt;
		printf("%d\n",ans);
		for(int i=1;i<=n;++i)
		if(color[i]==t) printf("%d ",i);
		printf("\n");
	}
}
发布了171 篇原创文章 · 获赞 0 · 访问量 5788

猜你喜欢

转载自blog.csdn.net/qq_42479630/article/details/104660234