package com.heu.wsq.leetcode.tree;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* 最小生成树(Kruskal)
* @author wsq
* @date 2021/3/11
*/
public class Kruskal {
private static class UnionFind{
int[] parent;
public UnionFind(int n){
parent = new int[n];
for (int i = 0; i < n; i++){
this.parent[i] = i;
}
}
public void union(int x, int y){
int rootX = find(x);
int rootY = find(y);
if (rootX == rootY){
return;
}
parent[rootX] = rootY;
}
public int find(int x){
int root;
if (parent[x] == x){
root = x;
}else{
root = find(parent[x]);
parent[x] = root;
}
return root;
}
public boolean isConnected(int x, int y){
return find(x) == find(y);
}
}
public static List<int[]> kruskal(int nodeNum, int edgeNum, List<int[]> edges){
// kruskal最小生成树算法
List<int[]> ans = new ArrayList<>();
// 根据权值排序edges
Collections.sort(edges, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[2] - o2[2];
}
});
// 构建并查集
UnionFind unionFind = new UnionFind(nodeNum);
// 遍历边,构建树,直到全部节点连通
for(int[] edge: edges){
if (unionFind.isConnected(edge[0], edge[1])){
continue;
}
unionFind.union(edge[0], edge[1]);
ans.add(new int[]{edge[0], edge[1]});
}
return ans;
}
public static void main(String[] args){
int nodeNum = 4;
int edgeNum = 3;
List<int[]> edges = new ArrayList<>(3);
edges.add(new int[]{0, 1, 3});
edges.add(new int[]{1, 2, 5});
edges.add(new int[]{2, 3, 1});
List<int[]> kruskal = kruskal(nodeNum, edgeNum, edges);
for (int[] edge: kruskal){
System.out.println("(" + edge[0] + ", " + edge[1] + ")");
}
}
}
最小生成树(Kruskal ,用于稀疏图)
最新推荐文章于 2022-12-31 10:56:01 发布