acwing算法基础之搜索与图论--染色法判断二分图

目录

  • [1 基础知识](#1 基础知识)
  • [2 模板](#2 模板)
  • [3 工程化](#3 工程化)

1 基础知识

二分图:每条边连接的起点和终点,分别属于集合A和集合B。

一个图是二分图,当且仅当,图中不含奇数环(即,回环中的结点数目是奇数)。

染色法判定二分图的关键步骤为:

  1. 初始化颜色数组color[1~n] = 0。
  2. 遍历每一个结点a:如果它没有被染色,将其染色为1,即dfs(a, 1)。
  3. 如果没有矛盾,则说明该图是二分图,否则,不是。
cpp 复制代码
bool dfs(int x, int c) {
	color[a] = c;
	//递归处理它的子结点
	for (auto b : g[a]) {
		if (!color[b]) {
			if (!dfs(b, 3 - c)) return false; 
		} else {
			if (color[b] == c) return false;
		}
	}
	return true;
}

2 模板

cpp 复制代码
int n;      // n表示点数
int h[N], e[M], ne[M], idx;     // 邻接表存储图
int color[N];       // 表示每个点的颜色,-1表示未染色,0表示白色,1表示黑色

// 参数: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] == -1)
        {
            if (!dfs(j, !c)) return false;
        }
        else if (color[j] == c) return false;
    }

    return true;
}

bool check()
{
    memset(color, -1, sizeof color);
    bool flag = true;
    for (int i = 1; i <= n; i ++ )
        if (color[i] == -1)
            if (!dfs(i, 0))
            {
                flag = false;
                break;
            }
    return flag;
}

3 工程化

题目1:请判断该图是否为二分图。

cpp 复制代码
#include <iostream>
#include <cstring>
#include <vector>

using namespace std;

const int N = 1e5 + 10;
int n, m;
vector<vector<int>> g(N);
int color[N];

bool dfs(int a, int c) {
    color[a] = c;
    
    //看结点a能走到哪儿
    for (auto b : g[a]) {
        if (!color[b] && !dfs(b, 3 - c)) return false;
        if (color[b] && color[b] == c) return false;
    }
    return true;
}

int main() {
    cin >> n >> m;
    int a, b;
    while (m--) {
        cin >> a >> b;
        g[a].emplace_back(b);
        g[b].emplace_back(a);
    }
    
    bool flag = true;
    for (int i = 1; i <= n; ++i) {
        if (!color[i] && !dfs(i, 1)) {
            flag = false;
            break;
        }
    }
    
    if (flag) {
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }
    
    return 0;
}
相关推荐
偷吃的耗子8 分钟前
【CNN算法理解】:CNN平移不变性详解:数学原理与实例
人工智能·算法·cnn
dazzle1 小时前
机器学习算法原理与实践-入门(三):使用数学方法实现KNN
人工智能·算法·机器学习
那个村的李富贵1 小时前
智能炼金术:CANN加速的新材料AI设计系统
人工智能·算法·aigc·cann
张张努力变强1 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
万岳科技系统开发1 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
张登杰踩1 小时前
MCR ALS 多元曲线分辨算法详解
算法
YuTaoShao2 小时前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法一)排序+滑动窗口
算法·leetcode·排序算法
波波0072 小时前
每日一题:.NET 的 GC是如何分代工作的?
算法·.net·gc
风暴之零2 小时前
变点检测算法PELT
算法
深鱼~2 小时前
视觉算法性能翻倍:ops-cv经典算子的昇腾适配指南
算法·cann