算法学习笔记(二分图染色)

首先我们需要明确什么是二分图:如果无向图 G = ( V , E ) G = (V, E) G=(V,E)的所有点可以分为两个集合 V 1 、 V 2 V_1、V_2 V1V2,所有的边都在 V 1 V_1 V1 V 2 V_2 V2之间,而 V 1 V_1 V1 V 2 V_2 V2的内部没有边,称 G G G是一个二分图。

直接说结论:如果一个图是二分图,那么它一定没有边数量为奇数的环。

判断一个图是否为二分图,一般用“染色法”进行判断。

用两种颜色对所有点进行染色,要求处在一条边上的两个点的颜色不能相同,染色结束后,如果没有相邻点颜色相同,那就是二分图。

例题;【模板】二分图判定

题目描述

给定一个 n n n m m m边的无向图,请判定它是否是一个二分图。

如果是,输出 " Y E S " "YES" "YES",反之输出 " N O " "NO" "NO"

输入描述

第一行三个整数 n n n, m m m ( 1 ≤ n , m ≤ 2 × 1 0 5 ) (1 \leq n,m \leq 2 \times 10^5) (1n,m2×105)

接下来 m m m行,每行两个整数 x , y x,y x,y表示一条无向边。 ( 1 ≤ x , y ≤ n , x ≠ y ) (1 \leq x,y \leq n,x \not = y) (1x,yn,x=y)

输出描述

一行输出结果。

输入样例1

4 4
1 2 
2 3
3 1
1 4

输出样例1

NO

输入样例2

4 4
1 2 
2 3
3 4
1 4

输出样例2

YES

染色法使用 d f s dfs dfs实现,下边给出带注释代码:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 2e5 + 9;

int n, m;
vector<int> g[N];
int col[N];     //存储颜色,-1表示未染色,0、1表示颜色

bool dfs(int x) //染色
{
    for(const auto &y : g[x])       //遍历所有边
    {
        if(col[y] == -1)            //如果没被染色
        {
            col[y] = col[x] ^ 1;    //染上不同颜色

            //下一个节点染不上色就返回flase,将flase传到main函数
            if(!dfs(y)) return false;
        }
        else if(col[y] == col[x]) return false;     //如果已经被染色但是和该节点颜色相同,也返回false
    }
    return true;
}

void solve()
{
    cin >> n >> m;

    //存图
    for(int i = 1; i <= m; ++i)
    {
        int x, y; cin >> x >> y;
        g[x].push_back(y);
        g[y].push_back(x);
    }

    //初始化
    for(int i = 1; i <= n; ++i) col[i] = -1;
    
    int ans = 1;
    for(int i = 1; i <= n; ++i)
    {
        if(col[i] == -1)
        {
            //用与运算只要有一个没染色答案就变成0
            ans &= dfs(i); 
        }
    }

    cout << (ans ? "YES" : "NO") << '\n';
}

int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int _ = 1;
    while(_--) solve();
    return 0;
}

注意初始化!!!注意初始化!!!注意初始化!!!

相关推荐

  1. 算法学习笔记二分染色

    2024-05-13 22:52:03       15 阅读
  2. 算法——论:判断二分染色问题)

    2024-05-13 22:52:03       19 阅读
  3. 二分 染色法 + 匈牙利算法

    2024-05-13 22:52:03       31 阅读
  4. 算法笔记二分搜索

    2024-05-13 22:52:03       37 阅读
  5. <span style='color:red;'>二分</span><span style='color:red;'>图</span>

    二分

    2024-05-13 22:52:03      22 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-13 22:52:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-13 22:52:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-13 22:52:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-13 22:52:03       20 阅读

热门阅读

  1. 第21篇 jsp指令

    2024-05-13 22:52:03       10 阅读
  2. 大佬代码中的js

    2024-05-13 22:52:03       10 阅读
  3. 模板方法模式

    2024-05-13 22:52:03       12 阅读
  4. Flutter 中的 TextField 小部件:全面指南

    2024-05-13 22:52:03       11 阅读
  5. 深度伪造音频普遍检测的Codecfake数据集和对策

    2024-05-13 22:52:03       12 阅读
  6. 代码随想录刷题记录7——力扣206,24,19题

    2024-05-13 22:52:03       13 阅读
  7. 格式化容量或速度

    2024-05-13 22:52:03       12 阅读
  8. tp8 设置空控制器和空方法

    2024-05-13 22:52:03       10 阅读
  9. NeoVim配置文件基本的

    2024-05-13 22:52:03       9 阅读
  10. spring boot常用的filter

    2024-05-13 22:52:03       9 阅读
  11. B树(B-Tree)

    2024-05-13 22:52:03       11 阅读