Python을 사용하여 Kruskal 알고리즘을 구현하는 방법은 무엇입니까?
소개:
Kruskal의 알고리즘은 최소 신장 트리를 해결하기 위한 고전적인 알고리즘으로, 주어진 가중치 연결 그래프에서 최소 총 가중치를 갖는 신장 트리를 찾을 수 있습니다. 이 기사에서는 Python을 사용하여 Kruskal의 알고리즘을 구현하는 방법을 소개하고 자세한 코드 예제를 제공합니다.
class Graph: def __init__(self, vertices): self.V = vertices # 顶点数 self.graph = [] # 添加边 def add_edge(self, u, v, weight): self.graph.append([u, v, weight]) # 查找根节点 def find(self, parent, i): if parent[i] == i: return i return self.find(parent, parent[i]) # 合并集合 def union(self, parent, rank, x, y): root_x = self.find(parent, x) root_y = self.find(parent, y) if rank[root_x] < rank[root_y]: parent[root_x] = root_y elif rank[root_x] > rank[root_y]: parent[root_y] = root_x else: parent[root_y] = root_x rank[root_x] += 1 # 克鲁斯卡尔算法 def kruskal_algorithm(self): result = [] i = 0 e = 0 self.graph = sorted(self.graph, key=lambda item: item[2]) # 按照权值排序 parent = [] rank = [] for node in range(self.V): parent.append(node) rank.append(0) while e < self.V - 1: u, v, weight = self.graph[i] i += 1 x = self.find(parent, u) y = self.find(parent, v) if x != y: e += 1 result.append([u, v, weight]) self.union(parent, rank, x, y) # 打印最小生成树 print("最小生成树:") for u, v, weight in result: print(f"{u} -- {v} {weight}") # 计算最小生成树的总权值 total_weight = sum(weight for u, v, weight in result) print("最小生成树的总权值:", total_weight) if __name__ == '__main__': g = Graph(6) g.add_edge(0, 1, 4) g.add_edge(0, 2, 3) g.add_edge(1, 2, 1) g.add_edge(1, 3, 2) g.add_edge(2, 3, 4) g.add_edge(2, 4, 3) g.add_edge(3, 4, 2) g.add_edge(3, 5, 1) g.add_edge(4, 5, 6) g.kruskal_algorithm()
결론:
Kruskal의 알고리즘은 연결된 그래프의 최소 스패닝 트리를 해결하는 효율적인 방법으로 간선을 정렬하고 집합을 병합하여 최소 총 가중치를 갖는 스패닝 트리를 얻을 수 있습니다. Python을 사용하여 Kruskal의 알고리즘을 구현하면 알고리즘의 원리와 프로세스를 더 잘 이해하고 실제 문제에 쉽게 적용할 수 있습니다.
위 내용은 Python을 사용하여 Kruskal 알고리즘을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!