public class Kruskal {
static int[] id = new int[10];
static List<Edge> list_edges = new ArrayList<Kruskal.Edge>();
static int[][] edge_matrix = new int[6][6];
final static int INF = Integer.MAX_VALUE;
static class Edge{
public int a;
public int b;
public int value;
public Edge(int a,int b,int value) {
this.a = a;
this.b = b;
this.value = value;
}
}
static class MyComparator implements Comparator<Edge>{
public int compare(Edge o1, Edge o2) {
if (o1.value > o2.value) {
return 1;
}
else if(o1.value < o2.value) {
return -1;
}
return 0;
}
}
public static int find(int a) {
int root = a;
while(id[root]>=0) {
root = id[root];
}
int i=0, k=a;
while(k!=root) {
i = id[k];
id[k] = root;
k = i;
}
return root;
}
public static void union(int a, int b) {
int rootA = find(a);
int rootB = find(b);
if (rootA == rootB) {
return;
}
int num = id[rootA]+id[rootB];
if(id[rootA] < id[rootB]) {
id[rootB] = rootA;
id[rootA] = num;
} else {
id[rootA] = rootB;
id[rootB] = num;
}
}
public static int kruskal() {
Collections.sort(list_edges,new MyComparator());
int sum = 0;
int count = 0;
for(int i=0; i < list_edges.size(); i++) {
Edge p = list_edges.get(i);
int a = p.a;
int b = p.b;
if(find(a) != find(b)) {
sum += p.value;
System.out.println("<"+a+"-"+b+">");
union(a, b);
count++;
}
}
return sum;
}
public static void main(String[] args) {
for (int i = 0; i < id.length; i++) {
id[i] = -1;
}
//测试
list_edges.add(new Edge(1, 2, 4));
list_edges.add(new Edge(1, 3, 1));
list_edges.add(new Edge(1, 4, 3));
list_edges.add(new Edge(2, 6, 2));
list_edges.add(new Edge(3, 5, 5));
list_edges.add(new Edge(3, 4, 1));
list_edges.add(new Edge(5, 6, 2));
System.out.println(kruskal());
}
}
Kruskal算法生成最小生成树
最新推荐文章于 2022-07-26 23:33:21 发布