LeetCode 二分图判定题解
LeetCode 二分图判定题解题目描述二分图是一种特殊的图它的顶点可以被分为两个不相交的集合使得图中的每条边都连接不同集合中的顶点。示例对于以下图A -- B | | C -- D这是一个二分图因为可以将顶点分为两个集合 {A, D} 和 {B, C}每条边都连接不同集合中的顶点。对于以下图A -- B -- C | | | D -- E -- F这也是一个二分图可以将顶点分为 {A, C, E} 和 {B, D, F}。解题思路方法深度优先搜索DFS思路二分图的判定可以通过染色法来实现。我们可以尝试用两种颜色对图中的顶点进行染色使得相邻的顶点颜色不同。具体步骤初始化一个颜色数组用于记录每个顶点的颜色0表示未染色1和-1表示两种不同的颜色。对每个未染色的顶点使用 DFS 进行染色将当前顶点染成颜色 1。遍历当前顶点的所有邻接顶点如果邻接顶点未染色则将其染成颜色 -1并递归进行染色。如果邻接顶点已经染色且颜色与当前顶点相同则说明图不是二分图。如果所有顶点都能被正确染色则说明图是二分图。复杂度分析时间复杂度O(V E)其中 V 是顶点数E 是边数。每个顶点和边都会被处理一次。空间复杂度O(V)需要存储颜色数组。代码实现方法深度优先搜索DFS# 二分图判定DFS 方法 def is_bipartite_dfs(graph): # 颜色数组0表示未染色1和-1表示两种不同的颜色 color {node: 0 for node in graph} def dfs(node, c): # 将当前顶点染成颜色 c color[node] c # 遍历邻接顶点 for neighbor in graph[node]: # 如果邻接顶点未染色 if color[neighbor] 0: # 递归染色邻接顶点使用相反的颜色 if not dfs(neighbor, -c): return False # 如果邻接顶点已经染色且颜色与当前顶点相同 elif color[neighbor] c: return False return True # 对每个未染色的顶点进行 DFS for node in graph: if color[node] 0: if not dfs(node, 1): return False return True # 测试 def test_is_bipartite_dfs(): # 测试用例 1二分图 graph1 { A: [B, C], B: [A, D], C: [A, D], D: [B, C] } print(Test case 1 (bipartite):, is_bipartite_dfs(graph1)) # 输出True # 测试用例 2非二分图包含奇数长度的环 graph2 { A: [B, C], B: [A, C], C: [A, B] } print(Test case 2 (not bipartite):, is_bipartite_dfs(graph2)) # 输出False if __name__ __main__: test_is_bipartite_dfs()方法广度优先搜索BFSfrom collections import deque # 二分图判定BFS 方法 def is_bipartite_bfs(graph): # 颜色数组0表示未染色1和-1表示两种不同的颜色 color {node: 0 for node in graph} # 对每个未染色的顶点进行 BFS for node in graph: if color[node] 0: # 初始化队列将当前顶点加入队列 queue deque([node]) # 将当前顶点染成颜色 1 color[node] 1 while queue: # 取出队首顶点 current queue.popleft() # 遍历邻接顶点 for neighbor in graph[current]: # 如果邻接顶点未染色 if color[neighbor] 0: # 将邻接顶点染成相反的颜色 color[neighbor] -color[current] # 将邻接顶点加入队列 queue.append(neighbor) # 如果邻接顶点已经染色且颜色与当前顶点相同 elif color[neighbor] color[current]: return False return True # 测试 def test_is_bipartite_bfs(): # 测试用例 1二分图 graph1 { A: [B, C], B: [A, D], C: [A, D], D: [B, C] } print(Test case 1 (bipartite):, is_bipartite_bfs(graph1)) # 输出True # 测试用例 2非二分图包含奇数长度的环 graph2 { A: [B, C], B: [A, C], C: [A, B] } print(Test case 2 (not bipartite):, is_bipartite_bfs(graph2)) # 输出False if __name__ __main__: test_is_bipartite_bfs()测试用例测试用例 1二分图输入A -- B | | C -- D输出True测试用例 2非二分图包含奇数长度的环输入A -- B | | C -- A输出False总结二分图是一种特殊的图它的顶点可以被分为两个不相交的集合使得图中的每条边都连接不同集合中的顶点。二分图的判定可以通过染色法来实现使用深度优先搜索DFS或广度优先搜索BFS来尝试用两种颜色对图中的顶点进行染色。二分图判定的核心思想是尝试用两种颜色对图中的顶点进行染色使得相邻的顶点颜色不同。如果能够成功染色则说明图是二分图否则说明图不是二分图。掌握二分图判定的原理和实现对于理解和解决图论相关问题非常重要。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2561451.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!