( 判断二分图)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
结果:
这里再留一个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