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的价值&…

支持国密ssl的curl编译和测试验证(下)

上接支持国密ssl的curl编译和测试验证(上) 4.4 验证国密http2协议功能 命令&#xff1a;/opt/gmcurl/bin/curl --http2 --tlcp "https://www.test.com:9443/" -kv输出&#xff1a;* Host www.test.com:9441 was resolved. * IPv6: (none) * IPv4: 127.0.0.1 * Tr…

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 …

C语言break 关键字在 switch 语句中应注意什么?

一、问题 switch 语句由 switch 分⽀点和多个 case 处理⼊⼜构成&#xff0c;每个 case 不具有处理互斥的功能&#xff0c;⼀个 case 执⾏完后&#xff0c;默认继续执⾏下⼀个 case。此时&#xff0c;如果不希望继续执⾏下⼀个 case,可以⽤ break 语句退出 switch 结构。break …

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;这时候假如我们有一个封装的对应加密解密工具类可以直接…

【DeepStream】基于英伟达DeepStream框架进行算法开发(一):GStreamer基础

目录 简介deepstream 来源于 GStreamerGStreamer关于RTP相关代码 简介 在当今快速发展的人工智能和计算机视觉领域&#xff0c;英伟达的DeepStream框架提供了强大的工具和功能&#xff0c;帮助开发者快速部署和优化实时视频分析应用。本博客将重点介绍基于英伟达DeepStream框架…

maven复合工程生成

1. maven命令生成复合工程&#xff1a; ------- mvn archetype:generate -DgroupIdcom.caiwm -DartifactIdspring-learn -DarchetypeArtifactIdmaven-archetype-quickstart -DinteractiveModefalse 修改packing为pom ------ cd composite-parent mvn archetype:generate -Dgrou…