Python数据结构,利用广度优先搜索编程实现确定无向图的连通分量。
class Graph:
def __init__(self, num_vertices):
self.num_vertices = num_vertices
self.adj_list = [[] for _ in range(num_vertices)]
def add_edge(self, u, v):
self.adj_list[u].append(v)
self.adj_list[v].append(u)
def bfs(graph, start, component_num, component):
queue = [start]
component[start] = component_num
while queue:
vertex = queue.pop(0)
for neighbor in graph.adj_list[vertex]:
if component[neighbor] is None:
queue.append(neighbor)
component[neighbor] = component_num
def get_connected_components(graph):
component_num = 0
component = [None] * graph.num_vertices
for vertex in range(graph.num_vertices):
if component[vertex] is None:
bfs(graph, vertex, component_num, component)
component_num += 1
return component
# 创建图
g = Graph(5)
g.add_edge(0, 1)
g.add_edge(0, 2)
g.add_edge(1, 2)
g.add_edge(2, 3)
# 获取连通分量
components = get_connected_components(g)
print(components) # 输出:[0, 0, 0, 1, 2]
下面是详细代码实现和注释,望采纳
from collections import deque
def get_connected_components(graph):
# 初始化所有节点的访问状态为未访问
visited = {node: False for node in graph}
# 初始化连通分量列表
connected_components = []
# 对每一个未访问过的节点执行广度优先搜索
for node in graph:
if not visited[node]:
# 执行广度优先搜索
component = bfs(graph, node, visited)
# 将搜索结果加入连通分量列表
connected_components.append(component)
return connected_components
def bfs(graph, start_node, visited):
# 初始化队列和连通分量
queue = deque()
component = []
# 将起始节点加入队列并标记为已访问
queue.append(start_node)
visited[start_node] = True
# 当队列不为空时,继续搜索
while queue:
# 从队列中取出下一个节点
node = queue.popleft()
# 将节点加入连通分量
component.append(node)
# 搜索与当前节点相连的所有未访问过的节点
for neighbor in graph[node]:
if not visited[neighbor]:
queue.append(neighbor)
visited[neighbor] = True
return component