/** 简单思路就是:直接用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]; } }