微信改版,加星标不迷路!

每日一算法-判断二分图

作者:阿广

阅读目录

  • 1 题目

  • 2 解析

1 题目

给定一个无向图graph,当这个图为二分图时返回true

如果我们能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我们就将这个图称为二分图。

graph将会以邻接表方式给出,graph[i]表示图中与节点i相连的所有节点。每个节点都是一个在0graph.length-1之间的整数。这图中没有自环和平行边: graph[i] 中不存在i,并且graph[i]中没有重复的值。

示例 1:输入:
[[1,3], [0,2], [1,3], [0,2]]
输出: true
解释: 无向图如下:
0----1
|    |
|    |
3----2
我们可以将节点分成两组: {0, 2} 和 {1, 3}。
示例 2:
输入: [[1,2,3], [0,2], [0,1,3], [0,2]]
输出: false
解释: 无向图如下:
0----1
| \  |
|  \ |
3----2
我们不能将节点分割成两个独立的子集。

注意:

?graph 的长度范围为 [1, 100]

?graph[i] 中的元素的范围为 [0, graph.length - 1]

?graph[i] 不会包含 i 或者有重复的值。

?图是无向的: 如果j 在 graph[i]里边, 那么 i 也会在 graph[j]里边。

2 解析


首先解释一下[[1,3], [0,2], [1,3], [0,2]]的意思,节点号为0的与1,3连接;节点号为1的与0,2连接;节点号为2的与1,3连接;节点号为3的与0,2连接。

思路是要将相连的两个顶点染成不同的颜色,一旦在染的过程中发现有两连的两个顶点已经被染成相同的颜色,说明不是二分图。这里我们使用两种颜色,分别用1和-1来表示,初始时每个顶点用0表示未染色,然后遍历每一个顶点,如果该顶点未被访问过,则调用递归函数,如果返回false,那么说明不是二分图,则直接返回false。如果循环退出后没有返回false,则返回true。在递归函数中,如果当前顶点已经染色,如果该顶点的颜色和将要染的颜色相同,则返回true,否则返回false。如果没被染色,则将当前顶点染色,然后再遍历与该顶点相连的所有的顶点,调用递归函数,如果返回false了,则当前递归函数的返回false,循环结束返回true。

2.1整体框架

class Solution {
public:bool isBipartite(vector<vector<int>>& graph) {vector<int> colors(graph.size());for (int i = 0; i < graph.size(); ++i) {//调用递归函数,判断图是否满足条件//调用valid()return false;}return true;}bool valid(vector<vector<int>>& graph, int color, int cur, vector<int>& colors) {//递归判断是否满足颜色的一致性}
};

2.2一旦在染的过程中发现有两连的两个顶点已经被染成相同的颜色,说明不是二分图。

if (colors[cur] != 0) return colors[cur] == color;

2.3这里我们使用两种颜色,分别用1和-1来表示,初始时每个顶点用0表示未染色,然后遍历每一个顶点,如果该顶点未被访问过,则调用递归函数,如果返回false,那么说明不是二分图,则直接返回false。如果循环退出后没有返回false,则返回true。

vector<int> colors(graph.size());//默认初始化为0
for (int i = 0; i < graph.size(); ++i) {if (colors[i] == 0 && !valid(graph, 1, i, colors)) {return false;}return true;
}

2.4在递归函数中,如果当前顶点已经染色,如果该顶点的颜色和将要染的颜色相同,则返回true,否则返回false。如果没被染色,则将当前顶点染色,然后再遍历与该顶点相连的所有的顶点,调用递归函数,如果返回false了,则当前递归函数的返回false,循环结束返回true。

if (colors[cur] != 0) return colors[cur] == color;
colors[cur] = color;
for (int i : graph[cur]) {if (!valid(graph, -1 * color, i, colors)) {return false;}
}
return true;

完整代码

class Solution {
public:bool isBipartite(vector<vector<int>>& graph) {vector<int> colors(graph.size());for (int i = 0; i < graph.size(); ++i) {if (colors[i] == 0 && !valid(graph, 1, i, colors)) {return false;}}return true;}bool valid(vector<vector<int>>& graph, int color, int cur, vector<int>& colors) {if (colors[cur] != 0) return colors[cur] == color;colors[cur] = color;for (int i : graph[cur]) {if (!valid(graph, -1 * color, i, colors)) {return false;}}return true;}
};

今日问题

你知道扫雷游戏如何玩吗?

仔细思考一下扫雷的算法!

你现在能不能写出来扫雷这款游戏?

打卡格式:打卡第n天,答:...

为什么打卡?戳下面你就知道了!

21/天/养/一/个/好/习/惯

【每日一算法】什么是二分图?相关推荐

  1. 【每日一算法】对称二叉树

    每日一算法-对称二叉树 题目 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1   / \  2   2 / \ / \ 3  4 4  3 但是 ...

  2. 【每日一算法】使用二分法解决x 的平方根问题

    每日一算法-x 的平方根 题目 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: ...

  3. 【每日一算法】二叉树的层次遍历 II

    每日一算法-二叉树的层次遍历 II 题目 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,n ...

  4. 【每日一算法】最大子序列和

    每日一算法-最大子序列和 题目 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] ...

  5. 【每日一算法】杨辉三角 II

    每日一算法-杨辉三角 II 题目 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 3 输出: [1,3,3,1] ...

  6. 【每日一算法】杨辉三角到底是什么?

    每日一算法-杨辉三角 题目 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 5 输出:[     [1], ...

  7. 【每日一算法】二叉树的最小深度

    每日一算法-二叉树的最小深度 题目 给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,2 ...

  8. 【每日一算法】合并两个有序数组

    每日一算法-搜索插入位置 题目 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 ...

  9. 【每日一算法】平衡二叉树

    微信改版,加星标不迷路! 每日一算法-搜索插入位置 作者:阿广 阅读目录 ? 题目 ? 解析 ? 完整代码 1 题目 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: ...

最新文章

  1. jQuery中鲜为人知的的几个方法
  2. php中怎么使用table,thinkphp中的table方法怎样使用?
  3. lnmp 切换mysql 版本_LNMP1.5:php多版本切换
  4. Spring jdbc 对象Mapper的简单封装
  5. java jni helloword_JNI入门教程之HelloWorld篇
  6. elasticsearch7使用指导
  7. red hat linux基本命令行,Red Hat Enterprise Linux4 一些常用命令总结
  8. android学习笔记---发送状态栏通知
  9. Dijstra算法-------为了纪念,等以后看的时候方便
  10. IOCP实现聊天服务
  11. python3字符串操作_python3字符串常用方法
  12. pe_xscan做了几个改动
  13. sam音高修正_Melodyneplugin音高修正插件使用入门(精)
  14. 电视行业和政策发展历程
  15. RxJava 学习笔记(七) --- Filtering 过滤操作
  16. 用人工智能做广告,它成为第一家走上IPO的人工智能企业
  17. 小马哥--高仿三星G9200 主板型号A208刷机拆机主板图
  18. 【Unity】让动画系统支持相对坐标
  19. python 安卓王者荣耀刷金币
  20. 【No7.】Android 像素转换工具

热门文章

  1. 苹果新功能惹网友众怒,还有隐私可言吗?
  2. 发布AI操作系统、应用市场,开源机器学习数据库和AI操作系统内核,第四范式这波操作有点秀!
  3. CSDN 星城大巡礼,长沙“科技之星”年度企业评选正式开启
  4. 零门槛!手把手教你打造AI应用
  5. 百度Apollo 3.5是如何设计Cyber RT计算框架的?
  6. AI一分钟 | 英伟达发布Tesla T4 GPU新品;腾讯发布《2018 年全球自动驾驶法律政策研究报告》...
  7. 7月Python和机器学习最佳开源项目Top 10!
  8. 陆奇激动地对世界说,百度就是中国的谷歌
  9. AI开发者们,2017年你们过得好吗?
  10. MyBatis中使用流式查询避免数据量过大导致OOM