题目链接
题意:给定一个有向图,要你选择一个不超过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");
}
}