/**
简单思路就是:直接用kruskal算法来求最小生成树,最长那一条边就是答案--- kruskal算法天生容易求最长边
1. 建立一个类存储顶点a ,顶点b, 权重w,将所有边放直接根据边来排序.
2. 搞个并查集。
3. 直接对边遍历(排好序从小大的)
1. pa = find(a) pb = find(b)直接找a , b的一个祖先
2. 如果a , b不在一个连通块即pb != pb ----> p[pa] = pb;放到一个连通块中
3. 这个时候你只要简单的 记录最后一条合并的边就好了 也就是最后一个
if(pa != pb){
p[pa] = pb;
max = edges[i].w; //即可
}
----------------------------------------没啥说的就是直接kruskal算法-----------------------------------
这里搞个有意思的:
下面也是我的第一思路,其实我也是写到一半才发现直接kruskal算法就好了,不过还是写下去了
这个思路是 二分+kruskal
我第一看到的是 最小值最大,我肯定是想到二分的
思路
1. mid = l + r >> 1. 我就拿进去算,对于这个图中所有 w > mid的我就不要了
2. 如果对于所有 w <= mid的值,你还可以组成一颗最小生成树,那么说明mid 大了 r = mid, 否则说明 mid 小了 l = mid + 1
3. 接下来就是让他不断二分。找到一个答案就行了
白白浪费时间 我贴的代码就会说二分 + kruskal的 有兴趣的自己改一下,这还是很快的。第二个思路就图一乐吧
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main{
static int idx, N = 10010, M = 1000010, n, m;
static Edge[] edges = new Edge[M];
static int[] p = new int[N];
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String[] arr = bf.readLine().split(" ");
n = Integer.parseInt(arr[0]); m = Integer.parseInt(arr[1]);
for(int i = 0; i < m; i ++){
String[] brr = bf.readLine().split(" ");
int a = Integer.parseInt(brr[0]), b = Integer.parseInt(brr[1]), c = Integer.parseInt(brr[2]);
edges[i] = new Edge(a, b, c);
}
Arrays.sort(edges, 0, m, (a, b)->a.w - b.w);
int l = 0, r = (int)1e9;
while(l < r){
int mid = l + r >> 1;
if(check(mid)) l = mid + 1;
else r = mid;
}
System.out.println(r);
}
static boolean check(int mid){
for(int i = 0; i <= n; i ++)
p[i] = i;
int res = 0, sum = 0;
for(int i = 0; i < m; i ++){
Edge t = edges[i];
int a = t.a, b = t.b, w = t.w;
if(w > mid) continue; // w > mid
//只有w >= mid的才去计算
int pa = find(a), pb = find(b);
if(pa != pb){
p[pa] = pb;
res ++;
}
}
if(res == n - 1) return false;
return true;
}
static class Edge{
int a, b, w;
public Edge(int a, int b, int w){
this.a = a; this.b = b; this.w = w;
}
}
static int find(int x){
if(p[x] != x)
p[x] = find(p[x]);
return p[x];
}
}