package ACM.Graph;
/* 使用并查集实现Kruscal算法
* */
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
class Edge {
int num;// 边的编号
int u;// 边的起点
int v;// 边的终点
int w;// 边的权重;
public Edge(int num, int u, int v, int w) {
this.num = num;
this.u = u;
this.v = v;
this.w = w;
}
}
class EdgeComparator implements Comparator<Edge> {
@Override
public int compare(Edge o1, Edge o2) {
if (o1.w < o2.w)
return -1;
else if (o1.w > o2.w)
return 1;
return 0;
}
}
public class Kruscal {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();// 顶点数
int m = scanner.nextInt();// 边数
Edge[] e = new Edge[m];
for (int i = 0; i < m; i++) {
e[i] = new Edge(i, scanner.nextInt(), scanner.nextInt(),
scanner.nextInt());
}
EdgeComparator ec = new EdgeComparator();
Arrays.sort(e, ec);//按权值大小给边排序
int[] p = new int[n + 1];
for (int i = 1; i <= n; i++)// 初始化并查集
p[i] = i;
int ans = 0;
Kruscal kru = new Kruscal();
for (int i = 0; i < m; i++) {
Edge ee = e[i];
int x = kru.find(ee.u, p);// 找出当前边两个端点的编号
int y = kru.find(ee.v, p);
if (x != y) {// 不在同一个并查集就合并
System.out.println("edge:(" + ee.u + "," + ee.v + ")");
ans += ee.w;
p[x] = y;
}
}
System.out.println("The minmum price is " + ans);
}
private int find(int i, int[] p) {
if (p[i] == i)
return i;
p[i] = find(p[i], p);// 更改i的父节点为根
return p[i];
}
}