zoukankan      html  css  js  c++  java
  • 染色法判定二分图

    给定一个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
    ";
    }


  • 相关阅读:
    java类加载过程
    进程和线程
    Java对象的创建
    java异常—检查异常(checked exception)和未检查异常(unchecked exception)
    try...catch...finally语句块
    Mysql数据库索引
    java-生产者消费者模式
    解压字符串
    Java-break,continue,return用法
    归并排序-Java
  • 原文地址:https://www.cnblogs.com/ilikeeatfish/p/13303242.html
Copyright © 2011-2022 走看看