数据结构(染色法判定二分图)

ops/2024/10/18 19:26:21/

所谓二分图,即可以把途中所有的点分成两类,满足关系是在同一类的点之间一定没有相连的边,不在同一类的点之间可以有相连的边。注意是可能有,不是一定都要有,且只能有两类不能有多类。

染色法基于一个定理,即奇数点构成的环一定不是二分图,证明:假如是同一类的两个同类的点相连,则在环除了这两个点以外的点,应该都满足交叉的,则必定会有奇数个,再加上这两个点,一共是奇数个点,因此一定不是二分图。

染色法具体的思路:

对于每个点进行判断,若当前的点未染色,则染成一个颜色,然后对于相连接的点,都染成另一种颜色,若有相连的点已经有颜色,则进行判断,若是同一种颜色则不是二分图,返回false,若所有点染色都成功,则是二分图,返回true。循环是看是否所有点染色都成功,只要其中一次染色失败就是false。这所以这样做,是因为有些点之间可能不存在通路,所以要对所有点都进行染色。

#include<iostream>
#include<cstring>using namespace std;
const int N=1000010;
int h[N],e[N],idx=0,ne[N];
int col[N];
int m,n;void add(int a,int b)
{e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}bool dye(int x,int c)
{   col[x]=c;for(int j=h[x];j!=-1;j=ne[j]){int t=e[j];if(!col[t]){if(!dye(t,3-c)){return false;}}else{if(col[t]!=3-c)return false;}}return true;
}int main()
{   memset(h,-1,sizeof h);scanf("%d%d",&n,&m);while(m--){int a,b;scanf("%d%d",&a,&b);add(a,b),add(b,a);}bool t=false;for(int i=1;i<=n;i++){   if(!col[i])if(!dye(i,1)){   t=true;break;}}if(t)puts("No");else puts("Yes");return 0;
}


http://www.ppmy.cn/ops/122443.html

相关文章

计算机毕业设计hadoop+spark天气预测 天气可视化 天气大数据 空气质量检测 空气质量分析 气象大数据 气象分析 大数据毕业设计 大数据毕设

Hadoop天气预测系统开题报告 一、研究背景与意义 在信息化和大数据时代&#xff0c;天气数据已成为社会生活和经济发展中不可或缺的重要资源。天气预测系统作为现代气象学的重要组成部分&#xff0c;对于农业生产、交通管理、环境保护以及防灾减灾等方面都具有重要意义。然而…

关于Qt音乐播放器进度条拖拽无用的问题解决方案

在使用Qt编写音乐播放器的时候&#xff0c;进度条关联播放音乐基本是必须的。那么在设计的过程中你可能会碰到一个奇怪的问题就是拖拽进度条的时候&#xff0c;可能会报错如下&#xff1a; 然后音乐就卡着不动了。。。 connect(ui->volume_toolButton,&VolumeToolBtn::…

[ 蓝桥 ·算法双周赛 ] 第 19 场 小白入门赛

&#x1f525;博客介绍&#xff1a; EvLast &#x1f3a5;系列专栏&#xff1a; <<数据结构与算法>> << 算法入门>> << C项目>> &#x1f3a5; 当前专栏: << 算法入门>> 专题 : 帮助小白快速入门算法竞赛 &#x1f44d…

自动驾驶-问题笔记-待解决

参考线的平滑方法 参考线平滑算法主要有三种&#xff1a; 离散点平滑&#xff1b;螺旋曲线平滑&#xff1b;多项式平滑&#xff1b; 参考链接&#xff1a;参考线平滑 对于平滑方法&#xff0c;一直不太理解平滑、拟合以及滤波三者的作用与区别&#xff1b; 规划的起点&#x…

【Docker从入门到进阶】04.高效实践

4. 高效实践 在现代软件开发中&#xff0c;Docker和容器技术使得应用程序的开发、部署和管理变得更为高效。然而&#xff0c;伴随而来的也是一些挑战&#xff0c;比如镜像优化、性能调优、安全性管理以及持续集成和持续交付&#xff08;CI/CD&#xff09;的集成等。以下是一些…

【unity进阶知识6】Resources的使用,如何封装一个Resources资源管理器

文章目录 一、Unity资源加载的几种方式1、Inspector窗口拖拽2、Resources3、AssetBundle4、Addressables&#xff08;可寻址资源系统&#xff09;5、AssetDatabase 二、准备三、同步加载Resources资源1、Resources.Load同步加载单个资源1.1、基本加载1.2、加载指定类型的资源1.…

Linux高级编程_29_信号

文章目录 进程间通讯 - 信号信号完整的信号周期信号的编号信号的产生发送信号1 kill 函数(他杀)作用&#xff1a;语法&#xff1a;示例&#xff1a; 2 raise函数(自杀)作用&#xff1a;示例&#xff1a; 3 abort函数(自杀)作用&#xff1a;语法&#xff1a;示例&#xff1a; 4 …

Hive数仓操作(十二)

一、Hive 中的行列转换 1. 行转列&#xff1a; collect_list() collect_list() 函数用于将一个列中的数据收集成一个数组。 示例数据文件 假设有一个名为 orders.txt 的文件&#xff0c;内容如下&#xff1a; 1,101 1,101 1,103 2,104 2,105导入数据到 Hive 表 首先&…