leetcode-判断二分图

. - 力扣(LeetCode)

存在一个 无向图 ,图中有 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 之间可能不存在一条连通彼此的路径。

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

如果图是二分图,返回 true ;否则,返回 false 。

示例 1:

输入:graph = [[1,2,3],[0,2],[0,1,3],[0,2]]
输出:false
解释:不能将节点分割成两个独立的子集,以使每条边都连通一个子集中的一个节点与另一个子集中的一个节点。

示例 2:

输入:graph = [[1,3],[0,2],[1,3],[0,2]]
输出:true
解释:可以将节点分成两组: {0, 2} 和 {1, 3} 。

提示:

  • graph.length == n
  • 1 <= n <= 100
  • 0 <= graph[u].length < n
  • 0 <= graph[u][i] <= n - 1
  • graph[u] 不会包含 u
  • graph[u] 的所有值 互不相同
  • 如果 graph[u] 包含 v,那么 graph[v] 也会包含 u

class Solution {
public:
    bool isBipartite(vector<vector<int>>& graph) {
        unordered_set<int> a;
        unordered_set<int> b;
        for (int i = 0; i < graph.size(); i++) {
            auto& nodes = graph[i];
            if (a.find(i) != a.end()) {
                for (int j = 0; j < nodes.size(); j++) {
                    if (a.find(nodes[j]) != a.end()) {
                        return false;
                    }
                    if (b.find(nodes[j]) == b.end()) {
                        b.insert(nodes[j]);
                    }
                }                
            } else if (b.find(i) != b.end()) {
                for (int j = 0; j < nodes.size(); j++) {
                    if (b.find(nodes[j]) != b.end()) {
                        return false;
                    }
                    if (a.find(nodes[j]) == a.end()) {
                        a.insert(nodes[j]);
                    }
                }
            } else {
                a.insert(i);
                for (int j = 0; j < nodes.size(); j++) {
                    if (a.find(nodes[j]) != a.end()) {
                        return false;
                    }
                    if (b.find(nodes[j]) == b.end()) {
                        b.insert(nodes[j]);
                    }
                }
            }
        }
        return true;
    }
};
class Solution {
public:
    bool isBipartite(vector<vector<int>>& graph) {
        int n = graph.size();
        vector<int> flags(n, 0);
        for (int i = 0; i < n; i++) {
            auto& nodes = graph[i];
            if (flags[i] == -1) {// in A
                for (int j = 0; j < nodes.size(); j++) {
                    if (flags[nodes[j]] == -1) {// in A
                        return false;
                    }
                    flags[nodes[j]] = 1;// put in B
                }
            } else if (flags[i] == 1) {// in B
                for (int j = 0; j < nodes.size(); j++) {
                    if (flags[nodes[j]] == 1) {// in B
                        return false;
                    }
                    flags[nodes[j]] = -1;// put in A
                }                
            } else {
                flags[i] = -1;
                for (int j = 0; j < nodes.size(); j++) {
                    if (flags[nodes[j]] == -1) {// in A
                        return false;
                    }
                    flags[nodes[j]] = 1;// put in B
                }                
            }
        }
        return true;
    }
};
class Solution {
public:
    bool isBipartite(vector<vector<int>>& graph) {
        int n = graph.size();
        vector<int> flags(n, 0);
        for (int i = 0; i < n; i++) {
            if (flags[i] == 0) {
                if (!isBipartite(i, 1, flags, graph)) {
                    return false;
                }
            }
        }
        return true;
    }

    bool isBipartite(int curNode, int curFlag, vector<int>& flags, vector<vector<int>>& graph) {
        if (flags[curNode] != 0) {
            return flags[curNode] == curFlag;
        }
        flags[curNode] = curFlag;
        for (auto nextNode : graph[curNode]) {
            if (!isBipartite(nextNode, -curFlag, flags, graph)) {
                return false;
            }
        }
        return true;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python 的join函数

join函数是一个对字符串处理的函数 字符串.join(str)的含义是把字符串加入到str的每一个间隙里面 如 str1234 ,.join(str) #打印的结果为 1,2,3,4

深入理解k8s kube-proxy

1、概述 我觉得只要大家知道kube-proxy是用来配置网络规则的而不是转发流量的&#xff0c;真正的流量由iptables/ipvs来转发就可以了。 网络是k8s的一个关键部分。理解k8s中网络组件如何工作可以帮助更好的设计和配置我们的应用。 kube-proxy就是K8s网络的核心组件。它把我们…

二豆写作能用吗 #笔记#笔记

二豆写作是一款非常好用、靠谱、方便的论文写作工具&#xff0c;它能帮助用户快速完成论文写作&#xff0c;并且具有查重降重的功能。那么&#xff0c;二豆写作到底能不能用呢&#xff1f;答案是肯定的&#xff0c;二豆写作绝对是值得推荐的。 首先&#xff0c;二豆写作提供了丰…

AWS实操-EC2-创建购买linux(centos)EC2服务器教程

AWS作为全球最大的云厂商&#xff0c;技术成熟&#xff0c;产品线丰富&#xff0c;很多用户在购买Linux系统&#xff0c;EC2服务器的时候会出现很多问题&#xff0c;这次九河云详细将AWS的购买流程进行图文阐述&#xff0c;以方便大家在后续的使用和购买。 启动实例 在AWS EC2…

《古琴律学教材》是一本不可或缺的指南,全阶段都适用

《古琴律学教材》是一本不可或缺的指南&#xff0c;它将帮助你深入了解古琴的琴音原理、调弦方法和突破瓶颈的技巧。无论你是初学者还是有一定基础的古琴爱好者&#xff0c;这本教材都是你必须看的。首先&#xff0c;教材详细解析了古琴律学的基本概念和原理。你将了解到古琴的…

一文搞懂NLP框架之RNN、LSTM、Transformer结构原理!

NLP领域中&#xff0c;特征提取可谓是经历了显著的“变迁”与发展。回首过往&#xff0c;RNN曾以其独特的序列建模能力一度引领潮流&#xff0c;如今正如同明日黄花&#xff0c;逐步淡出历史舞台。紧接着&#xff0c;LSTM以解决长时依赖问题的独特设计展现出强大的生命力&#…

STM32中C编程引入C++程序

C具备类的创建思想很实用于实际场景多相似性的框架搭建&#xff1b;同种类型或相似类型的C的优势明显因此进行相互嵌套使用 需要在C中使用C类的话&#xff0c;你可以通过C的“extern "C"”语法来实现。这允许你在C代码中使用C的链接方式&#xff0c;而在C代码中使用…

SCP收容物051~060​

注 &#xff1a;此文接SCP收容物041~050​,本文只供开玩笑 ,与steve_gqq_MC合作。 --------------------------------------------------------------------------------------------------------------------------------- 目录 SCP-051 SCP-052 SCP-053 SCP-054 SCP-0…

【C语言】青蛙跳台阶问题

题目&#xff1a;一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级台阶。现求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 题目分析&#xff1a; 当 n 等于 1 时&#xff0c;青蛙只能跳一级台阶到达&#xff0c;因此只有一种跳法&#xff0c;直接返回 1。当 n 等于 2 时…

万字源码解析!彻底搞懂 HashMap【二】:putVal 方法和 resize 方法(重点)

HashMap 的底层原理和扩容机制一直都是面试的时候经常被问到的问题&#xff0c;同时也是集合源码中最难阅读的一部分&#x1f622;&#xff0c;之前更新的 ArrayList 源码阅读收获了很多朋友的喜欢&#xff0c;也给了我很多自信&#xff1b;本次我准备完成一个关于 HashMap 源码…

CST操作教程|精简仿真结果容量和隐藏结构的加密保护功能

使用Archive As精简仿真结果容量 结果保持不变&#xff0c;缩小仿真结果容量的方法。 File > Project > Archive As simulation后保存数据时仿真文件容量太大很是让人头大。为什么文件容量变这么大呢?通常不是因为CST图标形状的.cst文件造成的&#xff0c;而是因为生…

C++set和map详细介绍

文章目录 前言一、关联式容器和序列式容器二、set1.set文档介绍2.set成员函数1.构造函数2.迭代器3.容量4.修改5.其他 三.multiset四.map1.map文档介绍2.map成员函数1.构造2.insert插入3.count4.迭代器5.【】和at 五.multimap总结 前言 在本篇文章中&#xff0c;我们将会学到关…

DC-DC芯片D1509适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。

一、应用领域 适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。 二、功能介绍 D1509是芯谷科技推出的一款输入耐压40V、输出电压1.23-37V可调、输出电流最大2.0A的高效率、高精度DC-DC芯片&#xff0c;其输出电压有固定3.3V、5.0V和12.0V的版本&#xff…

BM96 主持人调度(二)(贪心算法)

一开始写的时候忘了给start、end数组赋值了 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** 计算成功举办活动需要多少名主持人* param n int整型 有n个活动* param start…

C#:用定时器监控定时器,实现中止定时器正在执行的任务,并重启

Windows服务中使用的比较多的是定时器&#xff0c;但这种定时任务有个比较大的毛病&#xff1a;有时会莫名其妙地停止执行&#xff08;长时间执行不完&#xff0c;假死&#xff09;&#xff0c;必须得手工重启Windows服务才能恢复正常。这个就太麻烦了。 有没有办法来实现定时…

Vue3快速上手 详细内容

Vue3快速上手 1.Vue3简介 2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff09;耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址&#xff1a;Release v3.0.0 One Piece vuejs/core Git…

什么是国密SSL证书,和其他SSL证书的区别?

我们要了解什么是SSL证书。SSL&#xff08;Secure Sockets Layer&#xff0c;安全套接层&#xff09;是一种安全协议&#xff0c;主要用于在互联网上对通信双方进行身份验证以及保障数据的安全传输。而SSL证书则是由权威的数字证书认证机构签发的&#xff0c;用于证明网站身份的…

【Linux】磁盘与文件系统管理

目录 一、 磁盘结构 1. 数据结构 2. 物理结构 3. 硬盘的接口类型 二、 如何使用Linux中的磁盘 三、 文件系统 四、 磁盘分区 1. MBR分区 2. 分区的优缺点 3. 磁盘及分区的管理工具 五、格式化与挂载 1. 格式化 2. 挂载 六、实例演示 1. 演示分区格式化挂载 2. …

C语言写流星雨代码

目录 需要包含的头文件 图片素材的路径 初始化背景图片 报错怎么解决&#xff1f; 初始化流星雨 放置流星雨图片 让流星雨动起来 总不能让流星砸到地面吧 是不是应该再来一点背景音乐&#xff1f; 所有代码 需要包含的头文件 IMAGE img;//创建流星雨的图片变量void…

HTML - 请你说一下如何阻止a标签跳转

难度级别:初级及以上 提问概率:55% a标签的默认语义化功能就是超链接,HTML给它的定位就是与外部页面进行交流,不过也可以通过锚点功能,定位到本页面的固定id区域去。但在开发场景中,又避免不了禁用a标签的需求,那么都有哪些方式可以禁用…