• 染色法判定二分图


    给定一个n个点m条边的无向图,图中可能存在重边和自环。

    请你判断这个图是否是二分图。

    输入格式

    第一行包含两个整数n和m。

    接下来m行,每行包含两个整数u和v,表示点u和点v之间存在一条边。

    输出格式

    如果给定图是二分图,则输出“Yes”,否则输出“No”。

    数据范围

    1n,m1051≤n,m≤105

    输入样例:

    4 4
    1 3
    1 4
    2 3
    2 4
    

    输出样例:

    Yes
    一个图是二部图<=>这个图没有奇数环<=>这个图可以被两种颜色间染
    dfs遍历邻接矩阵,如果出现相邻同色则返回false,注意无向图
    #include<bits/stdc++.h>
    using namespace std;
    #define forn(i,n) for(int i=0;i<n;i++)
    #define form(i,n) for(int i=1;i<=n;i++)
    const int SIZE=5010;
    const int N=2e5+20;
    const int M=2*N;
    typedef long long ll;
    int n,m,k;
    int e[N],h[N],cnt,to[N],col[M];
    void add(int a,int b){
        to[cnt]=h[a];
        e[cnt]=b;
        h[a]=cnt++;
    }
    bool dfs(int x,int cl){
        col[x]=cl;
        for(int i=h[x];i;i=to[i]){
            int now=e[i];
            if(!col[now]){
                if(!dfs(now,3-cl))return false;
            } else if(col[now]==cl)return false;
        }
        return true;
    }
    int main(){
        cin>>n>>m;
        int flag=0;
        form(i,m){
            int a,b;
            cin>>a>>b;
            add(a,b);
            add(b,a);
        }
        for(int i=1;i<=n;i++){
            if(!col[i]){
                if(!dfs(i,1)){
                    flag=1;
                    break;
                }
            }
        }
        if(flag)cout<<"No
    ";
        else cout<<"Yes
    ";
    }


  • 相关阅读:
    AC 自动机
    [P4735] 最大异或和
    [HNOI2006] 最短母串问题
    [SHOI2002] 取石子游戏
    [NOI2014] 动物园
    [BZOJ2839] 集合计数
    【Spark】object not serializable (class: A)
    【Hbase】Master startup cannot progress, in holding-pattern until region onlined.
    Hbase 各个角色的工作。
    hbase region均衡机制
  • 原文地址:https://www.cnblogs.com/ilikeeatfish/p/13303242.html
Copyright © 2020-2023  润新知