CCCPaste

7f565d5deeb21

// Java program for the above approach
import java.util.*;
// Implementation of DSU
class UnionFind {
	private int[] parent;
	private int[] rank;
	private int time;
	private int count;
	
	public UnionFind(int N)
	{
		parent = new int[N];
		rank = new int[N];
		time = 0;
		count = N;
		
		for (int i = 0; i < N; i++) {
			parent[i] = i;
			rank[i] = 1;
		}
	}

	public int find(int node)
	{
		if (node == parent[node])
			return node;
		return parent[node] = find(parent[node]);
	}
	
	public void performUnion(int u, int v, int updatedTime)
	{
		if (count == 1)
			return;
		
		int rootX = find(u);
		int rootY = find(v);
		
		if (rootX != rootY) {
			if (rank[rootX] < rank[rootY]) {
				parent[rootX] = rootY;
			}
			else if (rank[rootX] > rank[rootY]) {
				parent[rootY] = rootX;
			}
			else {
				parent[rootX] = rootY;
				rank[rootY] += 1;
			}
			
			time = updatedTime;
			count--;
		}
	}
	
	public int getCount() { return count; }

	public int getTime() { return time; }
}

class Main {
	private static int earliestTime(List arr, int N)
	{
		arr.sort(Comparator.comparingInt(a -> a[2]));

		UnionFind unionFind = new UnionFind(N);

		for (int[] it : arr) {
			unionFind.performUnion(it[0], it[1], it[2]);
		}

		return unionFind.getCount() == 1
			? unionFind.getTime()
			: -1;
	}

	public static void main(String[] args)
	{
		int N = 6;
		List arr
			= Arrays.asList(new int[][] { { 0, 1, 4 },
										{ 3, 4, 5 },
										{ 2, 3, 14 },
										{ 1, 5, 24 },
										{ 2, 4, 12 },
										{ 0, 3, 42 },
										{ 1, 2, 41 },
										{ 4, 5, 11 } });

		System.out.println(earliestTime(arr, N));
	}
}