当前位置: 首页 > news >正文

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

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

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

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

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

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

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

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

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

#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;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MySQL系列—8.存储结构
  • 中医世家龚洪海博士:用医术和真诚赢得患者的心
  • SPIRNGBOOT+VUE实现浏览器播放音频流并合成音频
  • 【开源大模型生态6】生态大咖与产品布局
  • 文本格式 .WAT
  • ueditor抓取图片
  • 2024.09.02 校招 实习 内推 面经
  • mysql快速定位cpu 占比过高的sql语句
  • UE5.3 新学到的一些性能测试合计(曼巴学习笔记)
  • 人工智能在行业中的应用
  • Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述
  • git分支的管理
  • 2024.09.04【读书笔记】|如何使用Tombo进行Nanopore Direct RNA-seq(DRS)分析
  • spring security 中的异常
  • 【Linux系统编程】TCP实现--socket
  • Angular 2 DI - IoC DI - 1
  • DataBase in Android
  • Go 语言编译器的 //go: 详解
  • in typeof instanceof ===这些运算符有什么作用
  • js对象的深浅拷贝
  • k8s 面向应用开发者的基础命令
  • rabbitmq延迟消息示例
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • 成为一名优秀的Developer的书单
  • 初识 beanstalkd
  • 分类模型——Logistics Regression
  • 工作中总结前端开发流程--vue项目
  • 好的网址,关于.net 4.0 ,vs 2010
  • 解析带emoji和链接的聊天系统消息
  • 两列自适应布局方案整理
  • 新手搭建网站的主要流程
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 最简单的无缝轮播
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ![CDATA[ ]] 是什么东东
  • #HarmonyOS:基础语法
  • #QT(串口助手-界面)
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (3)选择元素——(17)练习(Exercises)
  • (LeetCode C++)盛最多水的容器
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (第30天)二叉树阶段总结
  • (剑指Offer)面试题34:丑数
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (一)appium-desktop定位元素原理
  • (一)VirtualBox安装增强功能
  • (转) ns2/nam与nam实现相关的文件
  • .NET 8 跨平台高性能边缘采集网关
  • .net MVC中使用angularJs刷新页面数据列表
  • .net MySql
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .Net程序帮助文档制作