当前位置: 移动技术网 > IT编程>脚本编程>Python > 力扣(LeetCode)( 判断二分图)Python3

力扣(LeetCode)( 判断二分图)Python3

2020年07月18日  | 移动技术网IT编程  | 我要评论
题目:判断二分图给定一个无向图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

结果:

这里再留一个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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网