【AcWing】860. 染色法判定二分图

devtools/2025/1/15 23:39:55/

二分图,把所有点划分到两边去,使得所有边都是在集合之间的,集合内部没有边。

一个图是二分图,当且仅当图中不含奇数环(环的边数是奇数)。这是个充分必要条件,是二分图就一定不含奇数环;不含奇数环就一定是二分图。

从前往后遍历每一个点,然后如果当前这个点还没有分好组的话,我们就把它分到左边去(右边也行),分完这个点之后,遍历一下这个点所有的邻点,所有和这个点连通的点,染色这个点所在的连通块。这个点属于左边的,那他相邻的点就属于右边,和右边这个点相邻的点就属于左边。

可以看成是一个染色的过程,我们要把所有点染上颜色(白色、黑色)。一条边的两个端点颜色不同,属于不同集合。通过这种方式可以把图中所有的点染色。

一个连通块中只要有一个点的颜色确定了,整个连通块所有点的颜色就确定了。

我们就可以用这样一种构造方式把整个图分成两个点集,使得所有边都是出现在两个点集之间的,那么显然是一个二分图。

某一次我们一个白色的点,搜到了一个已经染过颜色的点,之前染过颜色这个点和当前这个点颜色是相同的,那就矛盾了,环中的点一定是奇数。

染色法判断一个图是不是二分图。一个图在染色过程中出现了矛盾,说明存在奇数环,就不是二分图。没有出现矛盾,可以完美的染一遍,就说明没有奇数环,就是二分图。

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;const int N=1e5+10,M=2e5+10;//无向图两条边2e5int n,m;
int h[N],e[M],ne[M],idx;
int color[N];//0代表没染色,染色的两种颜色是1和2void 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;//那就染色,3-c把1变成2,把2变成1,染相对的颜色。}else if(color[j]==c) return false;//如果已经染色,两个相邻点颜色相同,那就矛盾了(染色图一条边的两段颜色不同),说明存在奇数环。}return true;
}int main(){cin>>n>>m;memset(h,-1,sizeof h);for(int i=0;i<m;i++){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)){//染了颜色1flag=false;break;}}}if(flag) puts("Yes");else puts("No");return 0;
}


http://www.ppmy.cn/devtools/109474.html

相关文章

在JS中flat() 和 flatMap()使用讲解

flat() 和 flatMap() 是 JavaScript 中处理数组的两个方法&#xff0c;用于处理嵌套数组&#xff0c;但它们有不同的用途和效果。以下是它们的详细区别&#xff1a; 1. Array.prototype.flat() 功能&#xff1a;将嵌套的数组“拉平”成一维数组。 语法&#xff1a; array.fla…

C语言新手小白详细教程(8)ASCll编码和字符串

&#x1f30f;个人博客主页&#xff1a;意疏-CSDN博客 希望文章能够给到初学的你一些启发&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏支持一下笔者吧&#xff5e; 阅读指南&#xff1a; 开篇说明ASCll编码字符串 开篇说明 本章节我们学习C语言中一个…

MySQL——视图(一)视图概述

视图是从一个或多个表中导出来的表&#xff0c;它是一种虚拟存在的表&#xff0c;并且表的结构和数据都依赖于基本表。通过视图不仅可以看到存放在基本表中的数据&#xff0c;并且还可以像操作基本表一样&#xff0c;对视图中存放的数据进行查询、修改和删除。与直接操作基本表…

Leetcode面试经典-115.不同的子序列

解法都在代码里&#xff0c;不懂就留言或者私信 理论上提交这个就是最优解 class Solution {public int numDistinct(String s, String t) {if(s.length() < t.length()) {return 0;}if(s.length() t.length()) {return s.equals(t)? 1 : 0;}char[] sArr s.toCharArray…

什么是图像的边缘?说说边缘检测的任务以及基本原理?

什么是图像的边缘&#xff1f;说说边缘检测的任务以及基本原理&#xff1f; 什么是图像的边缘&#xff1f;边缘检测的任务边缘检测的基本原理 什么是图像的边缘&#xff1f; 图像的边缘是图像中亮度、颜色或纹理等特征发生急剧变化的地方&#xff0c;这些变化通常代表了图像中…

Llama 3.1大模型的预训练和后训练范式解析

Meta的Llama大型语言模型每次出新版本&#xff0c;都会是一大事件。前段时间他们不仅发布了3.1的一个超大型的405亿参数模型&#xff0c;还对之前的8亿和70亿参数的模型做了升级&#xff0c;让它们在MMLU测试中的表现更好了。 不同模型在MMLU基准测试中的表现 他们还出了一个9…

elementUI table 给表头添加气泡显示(鼠标悬浮显示注释)

elementUI table 给表头添加气泡显示&#xff08;鼠标悬浮显示注释&#xff09; 前言&#xff1a;文档显示&#xff1a;&#xff08;使用插槽&#xff0c;我看看到底是怎么个事儿&#xff09;文档代码:修改后的效果&#xff1a;页面效果&#xff1a; 前言&#xff1a; 公司出现…

开源可视化大屏superset Docker环境部署

superset 开源可视化大屏Docker环境部署 前言 superset是俄罗斯开源的一款可视化大屏&#xff0c;用于数据可视化探索&#xff0c;含有丰富的图表组件&#xff0c;可以支持接入各种数据源。 接触superset就是想体验下可视化大屏功能&#xff0c;想最快速度安装成功&#xff…