0
点赞
收藏
分享

微信扫一扫

cf1133 Round #544 Div3-F1【图论】

就是耍帅 2022-01-21 阅读 24

Date:2022.01.21
题意:
n个点m条边的图,无自环和重边。找到一个生成树,使得度数最大的点的度数不变。
在这里插入图片描述

思路:这可能是最简单的3F,找到一个度数最大的点,与它的直接邻点相连的边一定选,选完将这些点标记为true,挨个搜这些邻点的邻点,dfs暴力搜莽过。
代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 4e5+10;
typedef long long LL;
bool st[N];
LL n,m;
LL idx,e[N],ne[N],h[N],d[N];
void add(LL a,LL b)
{
    e[idx]=b;
    ne[idx]=h[a];
    h[a]=idx++;
}
void dfs(LL x)
{
    st[x]=true;
    for(int i=h[x];i!=-1;i=ne[i])
    {
        if(st[e[i]]) continue;
        cout<<x<<' '<<e[i]<<endl;
        dfs(e[i]);
    }
}
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n>>m;
    memset(h,-1,sizeof h);
    while(m--)
    {
        LL x,y;cin>>x>>y;
        add(x,y);add(y,x);d[x]++;d[y]++;
    }
    LL maxd=0,x=0;
    for(int i=1;i<=n;i++) {maxd=max(maxd,d[i]);}
    for(int i=1;i<=n;i++) 
        if(d[i]==maxd) {x=i;break;}
    st[x]=true;
    for(int j=h[x];j!=-1;j=ne[j])
    {
        st[e[j]]=true;
        cout<<x<<' '<<e[j]<<endl;
    }
    for(int j=h[x];j!=-1;j=ne[j])
        dfs(e[j]);
    return 0;
}
举报

相关推荐

0 条评论