860. 染色法判定二分图 题解

题目描述

avata

题解思路

参考https://www.acwing.com/solution/content/5281/

代码

cpp
#include <iostream>
#include <cstring>
using namespace std;
const int N = 100010, M = 2 * N;  // 无向图, 所以最大边数是2倍

int n, m, a, b;
// 邻接表方式存储图, 无向图可能会连接M条边
// color[N], 为0代表还未染色省去一个bool数组,1代表染颜色1,2代表染颜色2
int h[N], ne[M], e[M], idx;
int color[N];

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

// 返回是否可以成功将u染色为c
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])  // 如果color[j]没有染过色 
        {
            if (!dfs(j, 3- c))  return false;  // 如果不可以将j成功染色
        }
        else if (color[j] == c) return false;  // 如果染过颜色且和c相同
    }
    return true;
}

int main()
{
    memset(h, -1, sizeof h);
    cin >> n >> m;
    while (m -- )
    {
        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))  // 如果dfs返回false 说明出现矛盾
            {
                flag = false;
                break;
            }
        }
    
    if (flag)   cout << "Yes";
    else cout << "No";
    
    return 0;
}
861. 二分图的最大匹配 题解
858. Prim算法求最小生成树 题解
Valaxy v1.0.0-rc.3 驱动|主题-Yunv1.0.0-rc.3