基础算法学习---染色法

原理

1,2为两种颜色,0为未染色
根据染色是否成功判断是否为二分图

模板

染色法判定二分图

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 200010;

int e[N],ne[N],h[N],idx;
int color[N];
int n,m;

//邻接表
void add(int a,int b){
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx ++;
}

bool dfs(int u,int c){
    color[u] = c;       //当前节点染色

    //邻接边染色
    for(int i = h[u];i != -1;i = ne[i]){
        int j = e[i];

        //未染色的尝试染成另一种颜色
        if(!color[j]){
            if(!dfs(j,3 - c)) return false;
        }else if(color[j] == c) return false;
    }

    return true;
}

int main(){
    cin >> n >> m;
    
    memset(h,-1,sizeof h);

    while(m --){
        int a,b;
        cin >> a >> b;

        add(a,b),add(b,a);
    }

//遍历检查
    bool flag = true;
    for(int i = 1;i <= n;i ++){
        if(!color[i]){
            if(!dfs(i,1)){
                flag = false;
                break;
            }
        }
    }

//判断是否为二分图
    if(flag) cout << "Yes";
    else cout << "No";
}
posted @ 2021-07-30 14:51  Xuuxxi  阅读(222)  评论(0)    收藏  举报