cf1176E. Cover it!(将连通图选出不超过一半的点 使剩点与已选某或多个相邻 生成树奇偶层)

题目
在这里插入图片描述
题意: 给你一张n个点m条边的连通图,无自环和重边。输出k和k个点的编号。 k<=[n/2]。使得没被选的点一定会和这k个点里至少一个有边相连。
思路: 直接将图生成一棵树,第一种涂色方法是将奇数层全涂色,若这种方法涂色节点数大于⌊n/2⌋,那么将偶数层全涂色肯定可行。

#include<bits/stdc++.h>
#define m(a,b) memset(a,b,sizeof a)
using namespace std;
const int N=2e5+5;
struct Edge{int to,nex;}edge[N<<1];int head[N],tot;
inline void add(int from,int to){
    edge[++tot]=(Edge){to,head[from]},head[from]=tot;
    edge[++tot]=(Edge){from,head[to]},head[to]=tot;
}
int cnt[2],vis[N];
void dfs(int x,int o){
    vis[x]=o,++cnt[o];
    for(int i=head[x];i;i=edge[i].nex){
        int y=edge[i].to;
        if(vis[y]==-1) dfs(y,o^1);
    }
}
int main(){
    int T;scanf("%d",&T);
    while(T--){
        int n,m;scanf("%d%d",&n,&m);
        for(int i=1;i<=n;++i) head[i]=0,vis[i]=-1;
        tot=0;cnt[0]=cnt[1]=0;
        for(int i=1,x,y;i<=m;++i) scanf("%d%d",&x,&y),add(x,y);
        dfs(1,0);
        int anscnt=cnt[0],dex=0;
        if(cnt[0]>cnt[1]) anscnt=cnt[1],dex=1;
        printf("%d\n",anscnt);
        for(int i=1;i<=n;++i) if(vis[i]==dex) printf("%d ",i);
        puts("");
    }
}
©️2020 CSDN 皮肤主题: 终极编程指南 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值