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;
}
相关推荐
pianmian11 小时前
贪心算法.
算法·贪心算法
chenziang12 小时前
leetcode hot 100 二叉搜索
数据结构·算法·leetcode
single5943 小时前
【c++笔试强训】(第四十五篇)
java·开发语言·数据结构·c++·算法
呆头鹅AI工作室4 小时前
基于特征工程(pca分析)、小波去噪以及数据增强,同时采用基于注意力机制的BiLSTM、随机森林、ARIMA模型进行序列数据预测
人工智能·深度学习·神经网络·算法·随机森林·回归
一勺汤5 小时前
YOLO11改进-注意力-引入自调制特征聚合模块SMFA
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·目标跟踪
每天写点bug5 小时前
【golang】map遍历注意事项
开发语言·算法·golang
程序员JerrySUN5 小时前
BitBake 执行流程深度解析:从理论到实践
linux·开发语言·嵌入式硬件·算法·架构
王老师青少年编程6 小时前
gesp(二级)(16)洛谷:B4037:[GESP202409 二级] 小杨的 N 字矩阵
数据结构·c++·算法·gesp·csp·信奥赛
robin_suli6 小时前
动态规划子序列问题系列一>等差序列划分II
算法·动态规划
cxylay7 小时前
自适应滤波算法分类及详细介绍
算法·分类·自适应滤波算法·自适应滤波·主动噪声控制·anc