首页 > 其他分享 >二分图

二分图

时间:2023-06-03 14:34:17浏览次数:33  
标签:二分 return int graph color false 节点

存在一个 无向图 ,图中有 \(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 {
    int[] color = new int[110];
    List<Integer>[] g = new List[110];
    public boolean isBipartite(int[][] graph) {
        int n = graph.length;
        Arrays.setAll(g, (a) -> new ArrayList<>());
        for(int i = 0; i < n; i++){
            for(int j : graph[i]){
                g[i].add(j);
            }
        }

        for(int i = 0; i < n; i++){
            if(color[i] == 0){
                if(!dfs(i, 1)) return false;
            }
        }
        return true;
    }

    public boolean dfs(int x, int c){
        color[x] = c;
        for(int y : g[x]){
            if(color[y] == 0){
                if(!dfs(y, 3 - c)) return false;
            }else{
                if(color[x] == color[y]) return false;
            }
        }
        return true;
    }
}

标签:二分,return,int,graph,color,false,节点
From: https://www.cnblogs.com/tobuv/p/17453939.html

相关文章

  • 二分查找
    二分查找#include<stdio.h>intbinary_search(int*a,intp,intq,intele){intmid=0;if(p>q){return0;}mid=p+(q-p)/2;if(ele==a[mid]){returnmid;}if(ele<a[mid]){returnbi......
  • 二分法 三元表达式 生成式 匿名函数 内置函数
    目录二分法三元表达式生成式列表生成式字典生成式集合生成式元组生成式(生成器)匿名函数内置函数二分法二分法思路1.二分法的使用前提条件:列表中得数字必须要有序2.将对象整除2分成两部分3.将目标数值与分割后的对象做比较来确定目标数值在哪一部分4.继续重复这两个步骤直至......
  • 算法之二分法、三元表达式、列表生成式、字典生成式(了解)、匿名函数、常见的内置函数
    算法之二分法二分概念二分算法,又称折半查找,即在一个单调有序的集合中查找一个解。每次分为左右两部分,判断解在哪个部分中并调整上下界,直到找到目标元素,每次二分后都将舍弃一半的查找空间。定义and实现:算法就是解决问题的高效办法常见的算法:二分法算法还可以锻炼我们的......
  • CF101234A Hacker Cups and Balls【二分+线段树】
    Description给一个长度为n的排列,对它做m次操作,每次对[l,r]区间内进行升序/降序排序。问最后的序列处于最中心的数是多少(n为奇数)。Solution是一类没有写过的题,参考题解。二分答案,对于当前的mid,将大于等于mid的数设置为1,小于mid的数设置为0。这样一来,叶结点的值......
  • spark Bisecting k-means(二分K均值算法)
    Bisectingk-means(二分K均值算法)    二分k均值(bisectingk-means)是一种层次聚类方法,算法的主要思想是:首先将所有点作为一个簇,然后将该簇一分为二。之后选择能最大程度降低聚类代价函数(也就是误差平方和)的簇划分为两个簇。以此进行下去,直到簇的数目等于用户给定的数目K为止。......
  • 算法:查找算法-二分查找
         ......
  • 「Note」 wqs 二分
    最大标志:选择恰好\(K\)个,使什么东西最优。就比如说\(f_{i,j}\)表示前\(i\)个数里选\(j\)个的最优解。直接求解复杂度很寄。如果\(f_{n,x}\)在坐标系里画出的是一个凸函数(\(x\)是取了多少个值),那么就可以进行wqs二分。我们想要求当\(x=K\)时的解,因为是凸函数所......
  • c++算法:二分
    算法中,有一种比线性查找算力费得更少的一种算法思想,叫“分治”,今天讲的是分治里的二分查找:借助(low+high)/2公式,找到搜索区域内的中间元素。图1中,搜索区域内中间元素的位置是 ⌊(1+10)/2⌋=5,因此中间元素是27,此元素显然不是要找的目标元素。然后就是缩小范围。 下面就是......
  • NEFU 635(二分+枚举)
    题目:TwinkleTwinkleLittleStar 题意:就是给n个点的坐标,然后在这个图形中找出一个边长最小的正方形,要求正方形的边平行于坐标轴且覆盖的点大于等于k个。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>usingnamespacestd;constintN=20......
  • 等比数列二分求和
    今天我们学习如何有效地求表达式的值。对于这个问题,用二分解决比较好。(1)当时,(2)当时,那么有    (3)当时,那么有   代码:#include<iostream>#include<string.h>#include<stdio.h>usingnamespacestd;constintM=1000000007;typedeflonglongLL;LLpower(LLa,LL......