返回介绍

lcof2 / 剑指 Offer II 106. 二分图 / README

发布于 2024-06-17 01:04:41 字数 4454 浏览 0 评论 0 收藏 0

剑指 Offer II 106. 二分图

题目描述

存在一个 无向图 ,图中有 n 个节点。其中每个节点都有一个介于 0n - 1 之间的唯一编号。

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

  • 不存在自环(graph[u] 不包含 u)。
  • 不存在平行边(graph[u] 不包含重复值)。
  • 如果 vgraph[u] 内,那么 u 也应该在 graph[v] 内(该图是无向图)
  • 这个图可能不是连通图,也就是说两个节点 uv 之间可能不存在一条连通彼此的路径。

二分图 定义:如果能将一个图的节点集合分割成两个独立的子集 AB ,并使图中的每一条边的两个节点一个来自 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

 

注意:本题与主站 785 题相同: https://leetcode.cn/problems/is-graph-bipartite/

解法

方法一

class Solution:
  def isBipartite(self, graph: List[List[int]]) -> bool:
    def find(x):
      if p[x] != x:
        p[x] = find(p[x])
      return p[x]

    n = len(graph)
    p = list(range(n))
    for u, g in enumerate(graph):
      for v in g:
        if find(u) == find(v):
          return False
        p[find(v)] = find(g[0])
    return True
class Solution {
  private int[] p;

  public boolean isBipartite(int[][] graph) {
    int n = graph.length;
    p = new int[n];
    for (int i = 0; i < n; ++i) {
      p[i] = i;
    }
    for (int u = 0; u < n; ++u) {
      int[] g = graph[u];
      for (int v : g) {
        if (find(u) == find(v)) {
          return false;
        }
        p[find(v)] = find(g[0]);
      }
    }
    return true;
  }

  private int find(int x) {
    if (p[x] != x) {
      p[x] = find(p[x]);
    }
    return p[x];
  }
}
class Solution {
public:
  vector<int> p;

  bool isBipartite(vector<vector<int>>& graph) {
    int n = graph.size();
    p.resize(n);
    for (int i = 0; i < n; ++i) p[i] = i;
    for (int u = 0; u < n; ++u) {
      auto& g = graph[u];
      for (int v : g) {
        if (find(u) == find(v)) return 0;
        p[find(v)] = find(g[0]);
      }
    }
    return 1;
  }

  int find(int x) {
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
  }
};
func isBipartite(graph [][]int) bool {
  n := len(graph)
  p := make([]int, n)
  for i := range p {
    p[i] = i
  }
  var find func(x int) int
  find = func(x int) int {
    if p[x] != x {
      p[x] = find(p[x])
    }
    return p[x]
  }
  for u, g := range graph {
    for _, v := range g {
      if find(u) == find(v) {
        return false
      }
      p[find(v)] = find(g[0])
    }
  }
  return true
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文