题目;
分析:最小生成树求出权值最大的边
#include <bits/stdc++.h>
using namespace std;
const int maxn = 500005;
const int maxm = 200005;
int F[maxn];
struct Edge
{
int u,v,w;
}edge[maxm];
int tot;
void addedge(int u,int v,int w)
{
edge[tot].u = u;
edge[tot].v = v;
edge[tot ++].w = w;
}
bool cmp(Edge a,Edge b)
{
return a.w < b.w;
}
int Find(int x)
{
if(F[x] == -1) return x;
else return F[x] = Find(F[x]);
}
int Kruskal(int n)
{
memset(F,-1,sizeof(F));
sort(edge,edge + tot,cmp);
int cnt = 0;
int ans = 0;
for(int i = 0;i < tot;i ++)
{
int u = edge[i].u;
int v = edge[i].v;
int w = edge[i].w;
int t1 = Find(u);
int t2 = Find(v);
if(t1 != t2)
{
ans = max(ans,w);
F[t1] = t2;
cnt ++;
}
if(cnt == n - 1) break;
}
if(cnt < n - 1) return -1;
else return ans;
}
int main()
{
int n,m,root;
cin >> n;
cin >> m;
cin >> root;
int u,v,w;
for(int i = 0;i < m;i ++)
{
cin >> u >> v >> w;
addedge(u,v,w);
addedge(v,u,w);
}
cout << Kruskal(n) << endl;
return 0;
}