Codeforces Round #628 (Div. 2)F找环||找独立集

Posted starve

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #628 (Div. 2)F找环||找独立集相关的知识,希望对你有一定的参考价值。

题:https://codeforces.com/contest/1325/problem/F

题意:给出n个点m条边的图,找到节点数大于等于sqrt(n)的环或节点数等于sqrt(n)的独立集;

分析:先找环,找不到环证明一定存在有独立集,独立集的找法就是01染色。

技术图片
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
const int M=1e5+5;
int flag,vis[M],book[M],deep[M],fa[M],need,ANS2;
vector<int>ans2,ans1,g[M];
void dfs(int u){
    if(flag)
        return;
    vis[u]=1;
    for(auto v:g[u]){
        if(flag)
            return;
        if(v==fa[u])
            continue;
        if(vis[v]){
            if(deep[u]-deep[v]+1>=need){
                for(int i=u;i!=fa[v];i=fa[i])
                    ans2.pb(i);
                flag=1;
                break;
            }

        }
        else{
            deep[v]=deep[u]+1;
            fa[v]=u;
            dfs(v);
        }
    }
    if(!book[u]){
        ans1.pb(u);
        for(auto v:g[u]){
            book[v]=1;
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m;
    cin>>n>>m;
    need=ceil(sqrt(n));
    for(int u,v,i=1;i<=m;i++){
        cin>>u>>v;
        g[u].pb(v);
        g[v].pb(u);
    }
    dfs(1);
    if(flag){
        cout<<2<<endl;
        cout<<ans2.size()<<endl;
        for(auto v:ans2)
            cout<<v<< ;
    }
    else{
        cout<<1<<endl;
        for(int i=0;i<need;i++)
            cout<<ans1[i]<< ;
    }
    return 0;
}
View Code

 

以上是关于Codeforces Round #628 (Div. 2)F找环||找独立集的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #628 (Div. 2) B.CopyCopyCopyCopyCopy(Set)

Codeforces Round #628 (Div. 2) C

Codeforces Round #628 (Div. 2) F——Ehab's Last Theorem dfs

Codeforces Round #628 (Div. 2) D. Ehab the Xorcist(异或,思维题)

Codeforces Round #628 (Div. 2) C.Ehab and Path-etic MEXs(图论,思维题)

二进制构造Codeforces Round #628 (Div. 2) D. Ehab the Xorcist