package com.PTA.graph.Kruskal;
import java.util.*;
public class Kruskal {
static Scanner cin = new Scanner(System.in);
static int Nv, Ne;
static ArrayList<Edge> edges;
static int[] s;
static class Edge implements Comparable<Edge>{
int v1, v2;
int w;
Edge(int v1, int v2, int w){
this.v1 = v1;
this.v2 = v2;
this.w = w;
}
@Override
public int compareTo(Edge o) {
return w - o.w;
}
}
static int find(int x) {
if (s[x] < 0) {
return x;
}else {
return s[x] = find(s[x]);
}
}
static int union(int root1, int root2) {
if(s[root1] > s[root2]) {
s[root2] += s[root1];
s[root1] = root2;
return root2;
}else{
s[root1] += s[root2];
s[root2] = root1;
return root1;
}
}
static boolean isSameSet(int x, int y) {
return find(x) == find(y);
}
static void kruskal(){
int edgeN = 0;
int cost = 0;
int nextEdge = 0;
s = new int[Nv+1];
Arrays.fill(s,-1);
Collections.sort(edges);
while (edgeN < Nv-1) {
if (nextEdge >= Ne) {
break;
}
int v1 = edges.get(nextEdge).v1;
int v2 = edges.get(nextEdge).v2;
if (!isSameSet(v1, v2)){
cost += edges.get(nextEdge).w;
edgeN++;
union(find(v1), find(v2));
}
nextEdge++;
}
if (edgeN < Nv-1){
cost = -1;
}
System.out.println(cost);
}
public static void main(String[] args) {
Nv = cin.nextInt();
Ne = cin.nextInt();
edges = new ArrayList<>();
if (Ne < Nv-1) {
System.out.println("-1");
}else {
for (int i = 0; i < Ne; i++) {
int from = cin.nextInt();
int to = cin.nextInt();
int w = cin.nextInt();
edges.add(new Edge(from, to, w));
}
kruskal();
}
}
}
package com.PTA.graph.Kruskal;
import java.util.*;
public class Main {
static Scanner cin = new Scanner(System.in);
static int Nv, Ne;
static Queue<Edge> edges;
static int[] s;
static class Edge implements Comparable<Edge> {
int v1, v2;
int w;
Edge(int v1, int v2, int w){
this.v1 = v1;
this.v2 = v2;
this.w = w;
}
@Override
public int compareTo(Edge o) {
return w - o.w;
}
}
public static void main(String[] args) {
Nv = cin.nextInt();
Ne = cin.nextInt();
edges = new PriorityQueue<>();
if(Ne < Nv - 1) {
System.out.println("-1");
}else {
for (int i = 0; i < Ne; i++) {
int from = cin.nextInt();
int to =cin.nextInt();
int w = cin.nextInt();
edges.add(new Edge(from, to, w));
}
kruskal();
}
}
static void kruskal() {
int edgCount = 0;
int cost = 0;
s = new int[Nv+1];
Arrays.fill(s, -1);
int index = 0;
while (edgCount < Nv - 1) {
if(index >= Ne) {
break;
}
int v1 = edges.peek().v1;
int v2 = edges.peek().v2;
if(isSameUnion(v1, v2) == false) {
edgCount++;
cost += edges.peek().w;
union(find(v1), find(v2));
}
index++;
edges.poll();
}
if (edgCount < Nv-1) {
cost = -1;
}
System.out.println(cost);
}
static void union(int root1, int root2) {
if (s[root1] < s[root2]) {
s[root1] += s[root2];
s[root2] = root1;
}else {
s[root2] += s[root1];
s[root1] = root2;
}
}
static int find(int x) {
if (s[x] < 0) {
return x;
}else {
return s[x] = find(s[x]);
}
}
static boolean isSameUnion(int x1, int x2) {
return find(x1) == find(x2);
}
}