关于二分图

news2024/9/23 15:31:48

什么是二分图

1. 从离散数学的角度理解:

A ---R---> B,B ---R---> A,且A、B自身不存在R关系,那么这种R关系对应的图就是二分图

二分图是一种无向图

 2. 从染色问题角度

你会发现:

奇数个结点无法完成染色 => 不会是二分图

 然后本文的代码实现思路就是依据染色角度实现

代码实现

DFS

class Solution {
public:
    bool ok = true;
    vector<bool> visited;
    vector<bool> color;
    bool isBipartite(vector<vector<int>>& graph) {
        int n = graph.size();
        visited.resize(n);
        color.resize(n);
        for(int i = 0; i < n; i++) {
            DFS(graph, i);
        }
        return ok;
    }

    void DFS(vector<vector<int>>& graph, int now) {
        if(!ok) return;
        visited[now] = true;
        for(auto next: graph[now]) {
            if(!visited[next]) {
                color[next] = !color[now];
                DFS(graph, next);
            }else {
                if(color[next] == color[now]) ok = false;
            }
        }
    }
};

BFS

class Solution {
public:
    bool ok = true;
    vector<bool> color;
    vector<bool> visited;
    bool isBipartite(vector<vector<int>>& graph) {
        int n = graph.size();
        color.resize(n);
        visited.resize(n);
        for(int i = 0; i < n; i++) {
            BFS(graph, i);
        }
        return ok;
    }

    void BFS(vector<vector<int>>& graph, int start) {
        queue<int> q;
        visited[start] = true;
        q.push(start);
        while(!q.empty()) {
            int cur = q.front();
            q.pop();
            for(auto next: graph[cur]) {
                if(!visited[next]) {
                    visited[next] = true;
                    q.push(next);
                    color[next] = !color[cur];
                }else {
                    if(color[next] == color[cur]) {
                        ok = false;
                        return;
                    }
                }
            }
        }
    }
};

 886. 可能的二分法 - 力扣(LeetCode)

把每个人看做节点,相互讨厌的关系看做图中的边,那么 dislikes 数组就可以构成一幅图;

(相互 => 双向图 => 无向图)

又因为题目说互相讨厌的人不能放在同一组里,相当于图中的所有相邻节点都要放进两个不同的组;

那就回到了「双色问题」,如果能够用两种颜色着色所有节点,且相邻节点颜色都不同,那么你按照颜色把这些节点分成两组不就行了嘛。

需要注意的是:

这题编号是从1开始,并非程序员熟悉的从0开始

建图的时候注意二分图是无向图

 DFS

class Solution {
public:
    vector<vector<int>> graph;
    vector<bool> visited;
    vector<bool> color;
    bool ok = true;
    bool possibleBipartition(int n, vector<vector<int>>& dislikes) {
        visited.resize(n + 1);
        color.resize(n + 1);
        buildGraph(n + 1, dislikes);
        for(int i = 1; i <= n; i++) {
            DFS(i);
        }
        return ok;
    }
    
    void buildGraph(int num, vector<vector<int>>& dis) {
        graph.resize(num);
        for(auto d: dis) {
            graph[d[0]].emplace_back(d[1]);
            graph[d[1]].emplace_back(d[0]);
        }
    }

    void DFS(int now) {
        if(!ok) return;
        visited[now] = true;
        for(auto next: graph[now]) {
            if(!visited[next]) {
                color[next] = !color[now];
                DFS(next);
            }else {
                if(color[next] == color[now]) ok = false;
            }
        }
    }
};

BFS

class Solution {
public: 
    vector<vector<int>> graph;
    vector<bool> visited;
    vector<bool> color;
    bool ok = true;
    bool possibleBipartition(int n, vector<vector<int>>& dislikes) {
        visited.resize(n + 1);
        color.resize(n + 1);
        buildGraph(n + 1, dislikes);
        for(int i = 1; i <= n; i++) {
            BFS(i);
        }
        return ok;
    }

    void buildGraph(int num, vector<vector<int>>& dis) {
        graph.resize(num);
        for(auto d: dis) {
            graph[d[0]].emplace_back(d[1]);
            graph[d[1]].emplace_back(d[0]);
        }
    }

    void BFS(int start) {
        queue<int> q;
        q.push(start);
        visited[start] = true;
        while(!q.empty()) {
            int cur = q.front();
            q.pop();
            for(auto next: graph[cur]) {
                if(!visited[next]) {
                    visited[next] = true;
                    color[next] = !color[cur];
                    q.push(next);
                }else {
                    if(color[next] == color[cur]) {
                        ok = false;
                        return;
                    }
                }
            }
        }
    }
};

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

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

相关文章

苹果手机相片删除了怎么恢复回来?恢复照片,3分钟搞定!

案例&#xff1a;苹果手机相片删除了还能找到吗&#xff1f; 【友友们&#xff0c;苹果手机照片不小心删除了&#xff0c;有什么方法可以快速恢复吗&#xff1f;】 如果你是苹果手机用户&#xff0c;那么你可能会经常使用手机的相机功能来记录生活中的美好瞬间。然而&#xff…

asp.net+sqlserver+C#网上订餐系统

目 录 第1章.绪论 4 1.1 系统开发背景 4 1.2 开发设计目的和意义 5 1.3 网上订餐系统设计思想 5 1.4可行性分析 6 1.4.1技术可行性分析 7 1.4.2其他可行性分析 7 第2章.需求分析 9 2.1 需求分析 9 2.2建立用例图 11 2.3描述用例图 11 2.3.…

传统机器学习(五)决策树算法(一)

传统机器学习(五)决策树算法(一) 1.1 决策树算法手动实现 ​ 可以参考&#xff1a;机器学习实战&#xff08;二&#xff09;决策树-分类树&#xff08;海洋生物数据集案例&#xff09; 1.2 sklearn决策树参数详解 1.2.1 入参参数详解 class sklearn.tree.DecisionTreeClas…

STM32H7B0VBT6芯片烧写程序踩坑记录

1.新的芯片第一次烧写需要通过ST官方烧录软件CubeProgrammer进行串口烧写。 软件下载: [https://www.stmcu.com.cn/Designresource/detail/software/710763] 或 [https://www.stmcu.com.cn/Designresource/detail/software/710762] 连接串口(A9,A10号引脚),打开文件 BOOT0拉高…

2023年学什么编程语言,最容易找工作?

在众多行业中&#xff0c;程序员属于高薪职业。无论是在国外还是国内&#xff0c;程序员的薪金水平普遍高于其他行业的工作岗位&#xff0c;例如web前端开发、软件工程、游戏开发、APP开发、网络爬虫、网站开发、人工智能开发、网络维护、Java开发、大数据分析、Python开发等工…

【艾特淘】淘宝新灯塔指标已更新,这几点要注意!

2022年新版淘宝新灯塔指标已于2022年8月1日正式生效&#xff0c;新版考核迭代了店铺指标&#xff0c;淘汰了过去考核能力较弱的指标&#xff0c;新增了旺旺满意度、平台求助率等指标&#xff0c;针对商家等级权益也有所调整&#xff0c;很多商家都对这些新的情况比较不了解。为…

JDBC(数据库和Java)

JDBC JDBC&#xff08;Java数据库连接&#xff09;是一种Java API&#xff08;应用程序编程接口&#xff09;&#xff0c;允许Java程序与数据库交互。它提供了一个标准接口&#xff0c;用于从Java程序连接到关系数据库&#xff08;如MySQL、Oracle和Microsoft SQL Server&#…

银行数字化转型导师坚鹏:商业银行数字化风控(1天)

商业银行数字化风控 课程背景&#xff1a; 数字化背景下&#xff0c;很多银行存在以下问题&#xff1a; 不清楚商业银行数字化风控发展现状&#xff1f; 不清楚对公业务数字化风控工作如何开展&#xff1f; 不知道零售业务数字化风控工作如何开展&#xff1f; 课程特色…

二叉树搜索树详解

定义 二叉搜索树&#xff08;BST&#xff0c;Binary Search Tree&#xff09; 或为一颗空树&#xff0c;或满足一下性质若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值它的左右…

单测时尽量用fake object

1. 单元测试的难点&#xff1a;外部协作者(external collaborators)的存在 单元测试是软件开发的一个重要部分&#xff0c;它有助于在开发周期的早期发现错误&#xff0c;帮助开发人员增加对生产代码正常工作的信心&#xff0c;同时也有助于改善代码设计。**Go语言从诞生那天起…

C++支持函数重载的原理--名字修饰

这章的原理并不难&#xff0c;前提是你要理解编译和链接。不会的会可以看一下这篇博客快速过一遍。 为什么C支持函数重载&#xff0c;而C语言不支持函数重载呢&#xff1f; 在C/C中&#xff0c;一个程序要运行起来&#xff0c;需要经历以下几个阶段&#xff1a;预处理、编译、汇…

Apache Flink ML 2.2.0 发布公告

来源 | Apache Flink 官方博客 翻译 | 林东 Apache Flink 社区很荣幸地宣布 Apache Flink ML 2.2.0 版本正式发布&#xff01;本次发布的版本重点添加了 Flink ML 中的特征工程算法。现在 Flink ML 包含了 33 个开箱可用的特征工程算法&#xff0c;可以支持很多常见的特征工程任…

springboot,Flowable 流程实例的激活与挂起(一)

一.简介 要实现流程实例的挂起和激活&#xff0c;首先要知道什么是流程实例的挂起和激活。 挂起&#xff1a; ①一个定义好的流程模板&#xff08;流程定义&#xff09;&#xff0c;如果挂起了&#xff0c;那么就无法据此创建新的流程实例。 ② 一个流程实例如果挂起了&#…

Pycharm必会小技巧,用好了都不用加班,效率翻2倍

学Python必用Pycharm&#xff0c;今天就来教大家11个Pycharm最常用的技巧&#xff0c;以及一些pycharm常用的快捷键&#xff0c;让你的写代码的效率翻2倍&#xff0c;以后都不用加班了&#xff01; 跟上老司机的车速&#xff01; 文章目录 一、常用小技巧1.设置代码字体。2.…

Nature:惊人的突破!科学家们成功破译人类嗅觉感应机制的奥秘!

加州大学旧金山分校&#xff08;UCSF&#xff09;的科学家们创造了第一张关于气味分子如何激活人类气味受体的分子水平的3D图片&#xff0c;这是破译嗅觉的关键一步&#xff0c;该成果打破了长期以来研究人员对嗅觉理解的僵局。 该研究成果于2023年3月15日发表在《Nature》&…

ch6_1计算机中运算方法

计算机中数的表示计算机的运算方法运算器的设计 参考教材 本章内容主要介绍&#xff0c;计算机中的运算方法 无符号数和有符号数数的定点表示和浮点表示定点运算浮点四则运算算术逻辑单元 1. 无符号数和有符号数 1.1 无符号数 1.2 有符号数 计算机中&#xff0c; 小数点…

java新版本新特性

2. Java8新特性&#xff1a;Lambda表达式 2.1 关于Java8新特性简介 Java 8 (又称为 JDK 8或JDK1.8) 是 Java 语言开发的一个主要版本。 Java 8 是oracle公司于2014年3月发布&#xff0c;可以看成是自Java 5 以来最具革命性的版本。Java 8为Java语言、编译器、类库、开发工具与…

【华为OD机试真题】AI处理器组合(java)100%通过率

AI处理器组合 知识点数组 时间限制:1s空间限制:256MB限定语言:不限 题目描述: 某公司研发了一款高性能Al处理器。每台物理设备具备8颗Al处理器,编号分别为 0、1、2、3、4、5、6、7。编号0-3的处理器处于同一个链路中,编号4-7的处理器 处于另外一个链路中,不通链路中的…

双目立体匹配中的极线约束(Epipolar Constraint),本质矩阵(Essential Matrix),对极几何(2D-2D)

极线约束&#xff08;Epipolar Constraint&#xff09;&#xff0c;本质矩阵&#xff08;Essential Matrix&#xff09;&#xff0c;对极几何&#xff08;2D-2D&#xff09; 1. The Epipolar constraint2. Essential matrix E E E 考虑一个SLAM中一个常见的问题&#xff1a;如…

【C++11】左值、右值、将亡值

值类别 C表达式的两个独立的属性&#xff1a;类型、值类别&#xff1b; 值类别分为&#xff1a;左值、纯右值、将亡值&#xff1b; 有名字的将亡值->左值&#xff1b;没名字-->右值 左值 能用&取地址的表达式&#xff1b; 例如&#xff1a;int a&#xff1b;可以…