这个问题等价于求最小生成树中权值最大的边。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std; const int maxn=;
int n,m;
struct X
{
int u,v;
long long val;
} e[maxn*maxn];
int f[maxn]; int Find(int x)
{
if(x!=f[x]) return f[x]=Find(f[x]);
return f[x];
} bool cmp(const X&a,const X&b)
{
return a.val<b.val;
} int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=; i<=n; i++) f[i]=i;
for(int i=; i<m; i++)
scanf("%d%d%lld",&e[i].u,&e[i].v,&e[i].val); int d=n;
sort(e,e+m,cmp);
long long ans=;
for(int i=; i<m; i++)
{
int fx=Find(e[i].u);
int fy=Find(e[i].v);
if(fx!=fy)
{
f[fx]=fy;
ans=e[i].val;
d--;
}
}
if(d!=) ans=-;
printf("%lld\n",ans);
}
return ;
}