19914 最小生成树2
19914 最小生成树2
⭐️难度:中等
🌟考点:最小生成树
📖
📚
import java.util.*;
public class Main {
static class Edge{
int u,v,w;
Edge(int u,int v,int w){
this.u = u;
this.v = v;
this.w = w;
}
}
static ArrayList<Edge> g = new ArrayList<>(); // 存边
static int n;
static int m;
static class UnionSet{ // 并查集
int[] f,sz;
UnionSet(int n){
f = new int[n+1];
sz = new int[n+1];
for (int i = 1; i <= n; i++) {
f[i] = i;
sz[i] = i;
}
}
int find(int x){
return f[x] == x ? x : (f[x] = find(f[x]));
}
void union(int x,int y){
int fx = find(x);
int fy = find(y);
if(sz[fx] < sz[fy]){
f[fx] = fy;
sz[fy] += sz[fx];
}else{
f[fy] = fx;
sz[fx] += sz[fy];
}
}
}
static boolean kruskal(){
g.sort(Comparator.comparingInt(e ->e.w));
UnionSet us = new UnionSet((n));
int cnt = 0;
int ans = 0; // 边权
for(Edge e : g){
if(us.find(e.u) == us.find(e.v)) continue;
us.union(e.u,e.v);
ans += e.w;
if(++cnt == n-1){
System.out.println(ans);
return true;
}
}
return false;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
for (int i = 0; i < m; i++) {
g.add(new Edge(sc.nextInt(), sc.nextInt(),sc.nextInt()));
}
if(!kruskal()){
System.out.println("impossible");
}
}
}