用Kruskal算法求最小生成树
程序员文章站
2024-02-29 08:12:10
...
输入格式:
第一行输入结点数量T
后续T行每行输入边的起点from、终点next、权weigth
输出:
最小生成树的权值之和
import java.util.*;
public class Kruskal {
static final int MAX=(int)(1e5+10);
static int T;
static Edge[] edge=new Edge[MAX];
static int[] s=new int[MAX];
public static void main(String[] args) {
init();
kruskal();
}
static void init(){
Scanner cin=new Scanner(System.in);
T=cin.nextInt();
for(int i=0;i<T;i++)
edge[i]=new Edge(cin.nextInt(), cin.nextInt(), cin.nextInt());
Arrays.sort(edge, 0, T, new Comparator<Edge>() {
@Override
public int compare(Edge o1, Edge o2) {
return o1.weigth-o2.weigth;
}
});
}
static int find(int x){
return s[x]==x?x:find(s[x]);
}
static void kruskal(){
int sum=0;
for(int i=1;i<=T;i++)
s[i]=i;
for(int i=0;i<T;i++){
int a=find(edge[i].from);
int b=find(edge[i].next);
if(a==b)
continue;
s[b]=a;
sum+=edge[i].weigth;
}
System.out.println(sum);
}
}
class Edge{
public int from;
public int next;
public int weigth;
Edge(int from,int next,int weigth){
this.from=from;
this.next=next;
this.weigth=weigth;
}
}