leetcode785. 判断二分图

news/2025/2/14 1:39:13/
  • https://leetcode.cn/problems/is-graph-bipartite/
  • 判断给定的图是否为二分图,如果图是二分图,返回 true ,否则,返回 false 。
  • 二分图 定义:如果能将一个图的节点集合分割成两个独立的子集 A 和 B ,并使图中的每一条边的两个节点一个来自 A 集合,一个来自 B 集合,就将这个图称为 二分图 。

存在一个 无向图 ,图中有 n 个节点。其中每个节点都有一个介于 0 到 n - 1 之间的唯一编号。给你一个二维数组 graph ,其中 graph[u] 是一个节点数组,由节点 u 的邻接节点组成。形式上,对于 graph[u] 中的每个 v ,都存在一条位于节点 u 和节点 v 之间的无向边。该无向图同时具有以下属性:

  • 不存在自环(graph[u] 不包含 u)。[一般邻接表表示的特点]

  • 不存在平行边(graph[u] 不包含重复值)。[一般邻接表表示的特点]

  • 如果 v 在 graph[u] 内,那么 u 也应该在 graph[v] 内(该图是无向图)[一般邻接表表示的特点]

  • 这个图可能不是连通图,也就是说两个节点 u 和 v 之间可能不存在一条连通彼此的路径。

输入:graph = [[1,3],[0,2],[1,3],[0,2]]
输出:true
解释:可以将节点分成两组: {0, 2}{1, 3} 。//子集各自几点没有相连
0
1
2
3
输入:graph = [[1,2,3],[0,2],[0,1,3],[0,2]]
输出:false
解释:不能将节点分割成两个独立的子集,以使每条边都连通一个子集中的一个节点与另一个子集中的一个节点。
0
1
2
3

题解

并查集

我们知道如果是二分图的话,那么图中每个顶点的所有邻接点都应该属于同一集合,且不与顶点处于同一集合。因此我们可以使用并查集来解决这个问题,我们遍历图中每个顶点,将当前顶点的所有邻接点进行合并,并判断这些邻接点中是否存在某一邻接点已经和当前顶点处于同一个集合中了,若是,则说明不是二分图。

#include <iostream>
#include<vector>
#include<memory>
using namespace std;class Solution_UnionSet {
public:bool res = true;//是否为二分图vector<int> fa;// 并查集int find(int val){if(fa[val] == val){return val;}else{return find(fa[val]);}}void merge(int x,int y){int fa_x = find(x);int fa_y = find(y);fa[fa_x] = fa_y;}bool isBipartite(vector<vector<int>>& g) {fa.resize(g.size());//并查集数组初始化for(int index=0;index<g.size();index++){fa[index] = index;}for(int i = 0; i < g.size(); i++){for(int v:g[i]){merge(g[i][0],v);//将当前节点的邻接节点划为一类if(find(i)==find(v)){//如果当前节点和邻接节点在一个集合中res = false;return false;}}}return res;}
};//revese 和 resize的区别,resize可以赋默认值,reverse只是分配了空间,不能进行a[i]的访问,需要依次push_back()
int main(){unique_ptr<Solution_UnionSet> mysolo = unique_ptr<Solution_UnionSet>(new Solution_UnionSet());vector<vector<int>> v {{1,2,3},{0,2},{0,1,3},{0,2}};//vector<vector<int>> v {{1,3},{0,2},{1,3},{0,2}};bool res = mysolo->isBipartite(v);cout<< res;
}//原版java代码来自链接:https://leetcode.cn/problems/is-graph-bipartite/solution/bfs-dfs-bing-cha-ji-san-chong-fang-fa-pan-duan-er-/

遍历染色

深度优先搜索 / 广度优先搜索

  • 我们使用图搜索算法从各个连通域的任一顶点开始遍历整个连通域,遍历的过程中用两种不同的颜色对顶点进行染色,相邻顶点染成相反的颜色。这个过程中倘若发现相邻的顶点被染成了相同的颜色,说明它不是二分图;反之,如果所有的连通域都染色成功,说明它是二分图。
#include <iostream>
#include<vector>
#include<memory>
using namespace std;class Solution {
public:bool res = true;//是否为二分图vector<bool> color;// 记录图中节点的颜色,false 和 true 代表两种不同颜色vector<bool> visited;// 记录图中节点是否被访问过bool isBipartite(vector<vector<int>>& graph) {color.resize(graph.size(),false);visited.resize(graph.size(),false);// ⭐因为图不一定是联通的,可能存在多个子图// 所以要把每个节点都作为起点进行一次遍历// 如果发现任何一个子图不是二分图,整幅图都不算二分图for(int i = 0; i < graph.size(); i++){if(!visited[i]){dfs(graph, i);}}return res;}// DFS 遍历void dfs(vector<vector<int>> graph, int v){if(!res) return; // ⭐优化:如果结果已经不是二分图了,就无需再继续遍历visited[v] = true;for(int i : graph[v]){if(!visited[i]){// 相邻节点 i 没有被访问过color[i] = !color[v]; // 那么应该给节点 i 涂上和节点 v 不同的颜色dfs(graph, i);}else{// 相邻节点 i 已经被访问过if(color[i] == color[v]){// 如果 v 和 i 的颜色相同则不是二分图res = false;}}}}
};//revese 和 resize的区别,resize可以赋默认值,reverse只是分配了空间,不能进行a[i]的访问,需要依次push_back()

http://www.ppmy.cn/news/41453.html

相关文章

科易动力携手企企通,打造数字化采购与供应链管理平台

近日&#xff0c;苏州科易新动力科技有限公司&#xff08;以下简称“科易动力”&#xff09;携手企企通举办了数字化采购项目启动会&#xff0c;双方企业高层、相关部门负责人参加了此次会议。会上&#xff0c;双方就数字化采购管理平台建设达成共识&#xff0c;企企通将将根据…

如何在Linux上安装宝塔并实现公网远程登录宝塔面板【内网穿透】

文章目录前言1. 安装宝塔2. 安装cpolar内网穿透3. 远程访问宝塔4. 固定http地址5. 配置二级子域名6. 测试访问二级子域名转发自CSDN远程穿透的文章&#xff1a;Linux安装宝塔&#xff0c;并实现公网远程登录宝塔面板【内网穿透】 前言 宝塔面板作为建站运维工具&#xff0c;它…

代码随想录算法训练营第四十一天-动态规划3|343. 整数拆分 ,96.不同的二叉搜索树

343整数拆分&#xff0c;有两种解法&#xff0c;一种是数学的方法&#xff0c;利用当f>4时&#xff0c;2*&#xff08;f - 2&#xff09;2f - 4 > f的性质&#xff0c;将所有的因子都拆成3&#xff0c;最后的余数再乘进去。另外一种是动态规划&#xff0c;把前面的数拆了…

Three.js教程:顶点颜色数据插值计算

推荐&#xff1a;将NSDT场景编辑器加入你3D工具链其他工具系列&#xff1a;NSDT简石数字孪生顶点颜色数据插值计算 上节课自定义几何体给大家介绍了一个顶点位置坐标概念&#xff0c;本节课给大家介绍一个新的几何体顶点概念&#xff0c;就是几何体顶点颜色。 通常几何体顶点…

回收站的文件删除了怎么恢复

回收站的文件删除了怎么恢复?我们的电脑删除文件后&#xff0c;这些删除的文件不会立马消失&#xff0c;而是会把删除的文件暂时存放在回收站里。直到我们清空了或者是设置的时间到了自动清空了。但如果遇到被清空的回收站里&#xff0c;有意外删除的文件该怎么办呢?要怎么才…

好看的html登录界面,

界面效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><title>Login Page</title><style>body {background-color: #f2f2f2;font-family: Arial, sans-serif;}form {background-color: #fff;border-radius: 5px;box-shado…

软考-套接字(scoket)

&#x1f4a4;SocketSocket套接字&#xff1a;是由系统提供用于网络通信的技术&#xff0c;是基于TCP/IP协议的网络通信的基本操作单元。将OSI模型中从传输层到物理层封装起来的抽象层&#xff0c;把网络协议隐藏在Socket抽象层中&#xff0c;只对使用者暴露API接口&#xff0c…

RestClient操作文档

RestClient操作文档5.RestClient操作文档5.1.新增文档5.1.1.索引库实体类5.1.2.语法说明5.1.3.完整代码5.2.查询文档5.2.1.语法说明5.2.2.完整代码5.3.删除文档5.4.修改文档5.4.1.语法说明5.4.2.完整代码5.5.批量导入文档5.5.1.语法说明5.5.2.完整代码5.6.小结5.RestClient操作…