亮亮解出了卷轴隐藏的秘密,来到了一片沼泽地。这里有很多空地,而面试直通卡可能埋在任意一块空地中,好在亮亮发现了一堆木材,他可以将木材铺在两个空地之间的沼泽地上。因为亮亮不知道面试直通卡具体在哪一块空地中,所以必须要保证任意一块空地对于亮亮来说是可以抵达的。
“怎么还有鳄鱼!没办法,看来有些空地不能直接到达了。” 亮亮虽然没有洁癖,但是沼泽地实在太臭了,所以亮亮不会循环利用木材。而且木材不能拼接在一起使用,所以亮亮必须要知道在耗费木材最少的情况下,最长的那根木材至少需要多长。
第一行包含两个整数N(1≤N≤10000),M(1≤M≤1000000)。N表示公有N块空地。 接下来M行,每行包含三个整数P(1≤P≤N),Q(1≤Q≤N),K代表P,Q两个间没有鳄鱼,需要耗费K的木材。
一个整数,即耗费木材最少的情况下,最长的那根木材长度。
4 3 1 2 1 2 3 1 3 4 2
2
import java.util.*;
// 最小生成树:Kruskal
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt(), m = in.nextInt();
int[][] edge = new int[m][3];
for (int i = 0; i < m; i++) {
int p = in.nextInt() - 1, q = in.nextInt() - 1, k = in.nextInt();
edge[i][0] = p;
edge[i][1] = q;
edge[i][2] = k;
}
Arrays.sort(edge, (e1, e2)->e1[2] - e2[2]); // 边长 升序
int max = 0;
UnionFind uf = new UnionFind(n);
for (int[] e : edge) {
int p = e[0], q = e[1], k = e[2];
if (uf.union(p, q)) {
max = Math.max(max, k);
}
}
System.out.println(max);
}
}
// 并查集
class UnionFind {
int[] parent;
int[] rank;
public UnionFind(int n) {
parent = new int[n];
rank = new int[n];
for (int i = 0; i < n; i++) {
parent[i] = i;
rank[i] = 1;
}
}
public int find(int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]);
}
return parent[x];
}
public boolean union(int x, int y) {
int rootX = find(x), rootY = find(y);
if (rootX == rootY) return false;
if (rank[rootX] > rank[rootY]) {
parent[rootY] = rootX;
} else if (rank[rootX] < rank[rootY]) {
parent[rootX] = rootY;
} else {
parent[rootY] = rootX;
rank[rootX]++;
}
return true;
}
} import java.util.*;
class Edge implements Comparable{
int node1;
int node2;
int value;
public Edge(int node1, int node2, int value){
this.node1 = node1;
this.node2 = node2;
this.value = value;
}
public int compareTo(Object o){
Edge edge = (Edge)o;
if(this.value > edge.value)
return 1;
else if(this.value < edge.value)
return -1;
else
return 0;
}
}
class Solution{
int n;
int m;
int[] parent;
Edge[] edges;
// 并查集找到父节点
public int find(int x){
if(parent[x] != x){
parent[x] = find(parent[x]);
}
return parent[x];
}
public void run(){
Scanner reader = new Scanner(System.in);
while(reader.hasNext()){
n = reader.nextInt();
m = reader.nextInt();
if(n == 1)
System.out.println(0);
// 并查集初始化 父节点
parent = new int[n + 1];
for(int i = 1; i <= n; i++){
parent[i] = i;
}
// 初始化所有edge
edges = new Edge[m];
for(int i = 0; i < m; i++){
edges[i] = new Edge(reader.nextInt(), reader.nextInt(), reader.nextInt());
}
Arrays.sort(edges);
// 一条边一条边判断
int cntNode = 0;
for(int i = 0; i < m; i++){
Edge cur = edges[i];
int node1 = cur.node1;
int node2 = cur.node2;
int node1Parent = find(node1);
int node2Parent = find(node2);
// 每次选择不属于同一棵树的edge
if(parent[node1] != parent[node2]){
parent[node1Parent] = node2Parent;
cntNode++;
}
if(cntNode == n-1){
System.out.println(cur.value);
return;
}
}
}
}
}
public class Main{
public static void main(String[] args){
Solution solution = new Solution();
solution.run();
}
}