染色法判定二分图

Posted ilikeeatfish

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了染色法判定二分图相关的知识,希望对你有一定的参考价值。

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

 



以上是关于染色法判定二分图的主要内容,如果未能解决你的问题,请参考以下文章

染色法判定二分图

二分图的判定(染色法)和二分图最大匹配(匈牙利)算法及模板

B - Bicoloring (二分图判定)

hdu5285-wyh2000 and pupil-(染色法二分图判定)

模板:二分图染色+判定

图论 —— 二分图的判定及最大匹配