欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

( 判断二分图)Python3数据结构算法

程序员文章站 2022-03-28 22:30:11
题目:判断二分图给定一个无向图graph,当这个图为二分图时返回true。如果我们能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我们就将这个图称为二分图。graph将会以邻接表方式给出,graph[i]表示图中与节点i相连的所有节点。每个节点都是一个在0到graph.length-1之间的整数。这图中没有自环和平行边:graph[i]中不存在i,并且graph[i]中没有重复的值。链接:https://leetcode-cn.....

题目:判断二分图

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

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

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


链接:https://leetcode-cn.com/problems/is-graph-bipartite

示例:

 

输入: [[1,3], [0,2], [1,3], [0,2]]
输出: true
解释: 
无向图如下:
0----1
|    |
|    |
3----2
我们可以将节点分成两组: {0, 2} 和 {1, 3}。

注意:

graph 的长度范围为 [1, 100]。
graph[i] 中的元素的范围为 [0, graph.length - 1]。
graph[i] 不会包含 i 或者有重复的值。
图是无向的: 如果j 在 graph[i]里边, 那么 i 也会在 graph[j]里边。

思路:

           深度优先遍历(DFS)+染色法

  通过利用染色法,遍历所有的结点,不同的结点使用不同的颜色进行标记。

        1.在遍历过程中,如果遇到相邻的结点染色为相同的颜色,则直接返回False

        2.着色并遍历完所有的结点,如果相邻的结点没有相同的颜色,则返回True

AC代码:

        visited = [False] * len(graph)  ## 标识节点是否被访问过
        colors = [-1] * len(graph)      ## 第i个节点着色为0或者1,-1表示未着色
        def helper(node, color):        ## 从结点NODE开始
            visited[node]  = True
            colors[node]  = color
            for n in graph[node]:       ## DFS进行遍历
                if not visited[n]:
                    if not helper(n, 1-color):
                        return False
                else:
                    if colors[n] == color:
                        return False
                    else:
                        continue
            return True
        for i in range(len(graph)):     ## 遍历所有连通图
            if not visited[i]:
                if not helper(i, 0):
                    return False        ## 找到相邻颜色一样false
            else:
                continue
        return True                     ## 没有找到true

结果:

( 判断二分图)Python3数据结构算法

这里再留一个180ms的代码作为欣赏:

        color = {}
        for vert in range(len(graph)):
            if vert in color:
                continue
            stack = [vert]
            color[vert] = 0
            while stack: 
                node = stack.pop()
                for nei in graph[node]: 
                    if nei not in color: 
                        color[nei] = color[node] ^ 1
                        stack.append(nei)
                    elif color[node] == color[nei]:
                        return False
        return True

题解参考:(LeetCode)ID:lxztju

本文地址:https://blog.csdn.net/adminkeys/article/details/107396928