AcWing 860. 染色法判定二分图

本题链接 :活动 - AcWing

题目:

样例:

输入
4 4
1 3
1 4
2 3
2 4

输出
Yes

思路:

        根据题目意思,我们明确一下二分图的含义。

        二分图是图论中的一个重要概念。一个图被称为二分图,当且仅当能够将其所有顶点分割成两个互不相交的子集,使得每条边的两个顶点分别属于不同的子集。

        换句话说,对于一个二分图,可以把图中的顶点分成两组,使得同一组内的顶点之间没有边相连,而不同组内的顶点之间有边相连。

        通俗的讲,二分图就像是一个人群中的男女混合舞会,所有参与者可以分成两组:男生和女生。在这个舞会上,男生只和女生跳舞,而不和其他男生跳舞;女生也只和男生跳舞,而不和其他女生跳舞。没有两个男生或两个女生会成对跳舞。

        如果一个图是二分图,就意味着可以将所有的点分成两组,使得同一组内的点之间没有直接相连的边,而不同组内的点之间有直接相连的边。这种特性在很多实际问题中都有重要的应用。

        所以,我们可以用DFS或者BFS暴搜即可枚举出答案。

代码详解如下:

DFS法:

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#define endl '\n'
#define int long long
#define Yes puts("Yes")
#define No puts("No")
#define umap unordered_map
#define All(x) x.begin(),x.end()
#pragma GCC optimize(3,"Ofast","inline")
#define IOS std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10;int n,m;// 数组模拟链表
vector<int>h(N,-1);	// 链表头指针
int e[N],ne[N],idx;
inline void Add(int a,int b)
{e[idx] = b,ne[idx] = h[a],h[a] = idx++;
}int color[N];	// 记录是否染色
// color 状态 0 表示未染色
// 			  1 表示染黑色
// 			  2 表示染白色bool DFS(int node,int inColor)
{color[node] = inColor;	// 将其染色// 枚举其相连的结点,查看是否染色for(int i = h[node];i != -1;i = ne[i]){int j = e[i];	// 取出相邻的结点// 如果相邻的结点没有染色if(!color[j]){// 我们将其染成当前结点的另一种颜色,其中如果出现冲突的染色,我们返回 falseif(!DFS(j,3 - inColor)) return false;}else if(inColor == color[j]) return false;// 否则,如果相邻的结点已经染色了,并且出现与当前结点的颜色冲突,我们返回 false}return true;	// 染色没有问题,返回 true
}inline void solve()
{cin >> n >> m;while(m--){int a,b;cin >> a >> b;Add(a,b),Add(b,a);	// 由于是无向图,所以双向相连}// 枚举每个结点查看是否染色for(int i = 1;i <= n;++i){// 如果没有染色,那么我们将其染色if(!color[i]){// 如果出现冲突的染色,直接输出 Noif(!DFS(i,1)){No;return ;}}}Yes;	// 如果都符合二分图定义,输出 Yes
}signed main()
{
//	freopen("a.txt", "r", stdin);IOS;int _t = 1;
//	cin >> _t;while (_t--){solve();}return 0;
}

最后提交:

BFS法:

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#define endl '\n'
#define int long long
#define Yes puts("Yes")
#define No puts("No")
#define umap unordered_map
#define All(x) x.begin(),x.end()
#pragma GCC optimize(3,"Ofast","inline")
#define IOS std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10;
using PII=pair<int,int>;
int n,m;// 数组模拟链表
vector<int>h(N,-1);	// 链表头指针
int e[N],ne[N],idx;
inline void Add(int a,int b)
{e[idx] = b,ne[idx] = h[a],h[a] = idx++;
}int color[N];	// 记录是否染色
// color 状态 0 表示未染色
// 			  1 表示染黑色
// 			  2 表示染白色inline bool BFS()
{queue<PII>q;	// 存储需染色结点// 枚举每个结点for(int i = 1;i <= n;++i){if(!color[i]){q.emplace(PII(i,1));// BFS 搜索while(q.size()){// 取出需染色的结点PII now = q.front();	q.pop();// 获取数据int node = now.first;int inColor = now.second;color[node] = inColor;	// 开始染色// 枚举相邻的结点,是否染色for(int i = h[node];i != -1;i = ne[i]){int j = e[i];if(!color[j]){q.emplace(PII(j,3 - inColor));	// 存储染色结点}else if(color[j] == inColor) return false;}}}}return true;
}inline void solve()
{cin >> n >> m;while(m--){int a,b;cin >> a >> b;Add(a,b),Add(b,a);	// 由于是无向图,所以双向相连}if(BFS()) Yes;else No;
}signed main()
{
//	freopen("a.txt", "r", stdin);IOS;int _t = 1;
//	cin >> _t;while (_t--){solve();}return 0;
}

最后提交:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/705568.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 2月27日,星期二

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年2月27日 星期二 农历正月十八 1、 应急管理部&#xff1a;彻查各类消防隐患&#xff0c;集中治理电动自行车进楼入户。 2、 电动车引发火灾事故频发&#xff0c;强制性国家标准即将出台。 3、 医保局&#xff1a;近年来纳…

vite+vue3图片引入方式不生效解决方案

vitevue3图片引入方式不生效解决方案 引入方式改成 const wordImgnew URL(/src/assets/MicsosoftWord.png,import.meta.url).href;原理

代码随想录Leetcode518. 零钱兑换 II

题目&#xff1a; 代码(首刷看解析&#xff09;&#xff1a; 这里的这个递推公式可以这么理解&#xff1a; 想象二维数组dp[ i ][ j ]其中i表示用前i种硬币&#xff0c;j表示价值总金额。dp[i][j]表示总方法数量。 那么dp[i][j]意义为&#xff1a; 用前i种硬币凑j的价值&…

Programming Abstractions in C阅读笔记:p303-p305

《Programming Abstractions in C》学习第74天&#xff0c;p303-p305总结&#xff0c;总计3页。 一、技术总结 1.时间复杂度分类(complexity classes) ClassNotationExampleconstantO(1)Returning the first element in an arraylogarithmicO(logN)Binary search in a sorte…

【SRE系列之Jenkins的使用】--实现ssh和http克隆

1、Jenkins的概念 1.1Jenkins的介绍 Jenkins是一个独立的开源软件项目&#xff0c;是基于Java开发的一种CI&#xff08;Continuous integration&#xff0c;持续集成&#xff09; &CD (Continuous Delivery&#xff0c;持续交付)工具&#xff0c;用于监控持续重复的工作&a…

简单聊聊现在的AI

简单聊聊现在的AI 前言主要的AI模型和形式LLM - Large Language Model&#xff08;大语言模型&#xff09;BOT&#xff08;机器人&#xff09;LAM - Large Action Models&#xff08;大行动模型&#xff09;Agent&#xff08;智能体&#xff09; 结尾 前言 好久没回来写博客&a…

LeetCode--72

72. 编辑距离 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1&#xff1a; 输入&#xff1a;word1 "horse", word2 …

web安全学习笔记【17】——信息打点(7)

信息打点-APP资产&知识产权&应用监控&静态提取&动态抓包&动态调试 #知识点&#xff1a; 1、业务资产-应用类型分类 2、Web单域名获取-接口查询 3、Web子域名获取-解析枚举 4、Web架构资产-平台指纹识别 ------------------------------------ 1、开源-CMS指…

C# 通过共享内存调用C++ 算法

需求&#xff1a; C#程序调用 C开发的dll. 一种C# 程序调用c 算法方案_算法怎么被c#调用-CSDN博客 上回书说到&#xff0c;将c算法封装为dll 插件&#xff0c;c加载后&#xff0c;暴露C风格接口&#xff0c;然后供C#调用。但是这样有几个问题&#xff1a; 1&#xff0c;一是…

【编程语言之·调试输出打印技巧】

系列文章目录 文章目录 前言一、调试打印输出开关1.1宏定义应用 二、打印错误的函数2.1 perror()2.2 strerror() 三、示例总结 前言 一、调试打印输出开关 1.1宏定义应用 示例1&#xff1a; #define DEBUG_ON 0 #if DEBUG_ON #define DEBUG(...) qDebug(__VA_ARGS__) #else …

【Python笔记-设计模式】中介者模式

一、说明 中介者模式是一种行为设计模式&#xff0c;减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互&#xff0c;迫使它们通过一个中介者对象进行合作。 (一) 解决问题 降低系统中对象之间的直接通信&#xff0c;将复杂的交互转化为通过中介者进行的间接交…

RK3568平台开发系列讲解(Linux系统篇)SPI 客户端通信

🚀返回专栏总目录 文章目录 一、spi_transfer二、spi_message三、初始化沉淀、分享、成长,让自己和他人都能有所收获!😄 SPI I/O模型由一组队列消息组成。我们提交一个或多个struct spi_message结构时,这些结构以同步或异步方式处理完成。单个消息由一个或多个struct sp…

Basisformer时间序列预测 锂电池SOC估计

Basisformer是一种基于Transformer架构的模型&#xff0c;用时间序列预测任务。 【Basisformer】时间序列预测 【锂电池SOC估计】 [1]采用自适应监督自监督对比学习方法学习时序特征 [2]通过双向交叉注意力机制计算历史序列和基准序列之间的相关系数 [3]最后通过相关系数…

动态规划(算法竞赛、蓝桥杯)--深入浅出的完全背包DP

1、B站视频链接&#xff1a;E09【模板】背包DP 完全背包_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N1010; int n,m; int v[N],w[N],f[N][N];int main(){scanf("%d%d",&n,&m);for(int i1;i<n;i){scanf("%d%d…

人像背景分割SDK,智能图像处理

美摄科技人像背景分割SDK解决方案&#xff1a;引领企业步入智能图像处理新时代 随着科技的不断进步&#xff0c;图像处理技术已成为许多行业不可或缺的一部分。为了满足企业对于高质量、高效率人像背景分割的需求&#xff0c;美摄科技推出了一款领先的人像背景分割SDK&#xf…

一款实用的.NET Core加密解密工具类库

前言 在我们日常开发工作中&#xff0c;为了数据安全问题对数据加密、解密是必不可少的。加密方式有很多种如常见的AES&#xff0c;RSA&#xff0c;MD5&#xff0c;SAH1&#xff0c;SAH256&#xff0c;DES等&#xff0c;这时候假如我们有一个封装的对应加密解密工具类可以直接…

虚拟机JVM

虚拟机 1、定义jvm 假想计算机 运行在操作系统之上 和硬件之间没有直接交互 包括 一套字节码指令、寄存器、栈、垃圾回收、堆 一个存储方法域 jvm:承担一个翻译工作&#xff0c;动态的将java代码编译成操作系统可以识别的机器码。 从软件层面屏蔽了不同操作系统在底层硬件与指…

petalinux-config : command not found 和petalinux-build: command not found

发现这两个问题都是因为&#xff1a;没有先设置 petalinux 的作环境 先输入命令 先执行 source /opt/pkg/petalinux/2020.2/settings.sh 或者 sptl 然后切换目录&#xff0c;到相应的目录&#xff0c;就可以了

【设计模式】使用门面模式简化接口的复杂度

文章目录 1.概述2.门面模式的定义3.门面模式的应用场景4.总结 1.概述 门面模式&#xff08;Facade Pattern&#xff09;又叫做外观模式&#xff0c;它通过为子系统提供一个统一的高层入口的方式&#xff0c;达到简化复杂系统的使用以及降低客户端与子系统之间的耦合度的效果&a…

LeetCode53题:最大子数组和(python3)

代码思路&#xff1a; 动态规划&#xff0c;使用动态规划如果上一个数是大于0&#xff0c;则加上&#xff1b;如果小于0直接用0。这样做的好处就是最终直接是最大子数组和。 class Solution:def maxSubArray(self, nums: List[int]) -> int:for i in range(1,len(nums)):nu…