o2,快读改用的都用了,orz 求助
#include<bits/stdc++.h>
using namespace std;
int n,m,t,ans=INT_MAX,fa[50005];
bool b;
struct jz
{
int l,r,t;
}s[200005];
bool comp(jz x,jz y)
{
return x.t<y.t;
}
int find(int x)
{
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
int k(int l)
{
if(m-l+1<n-1) return -1;
int tot=n,maxn=-1,minn=INT_MAX;
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=l;i<=m;i++)
{
if(find(s[i].l)!=find(s[i].r))
{
tot--;
fa[find(s[i].l)]=find(s[i].r);
maxn=max(maxn,s[i].t);
minn=min(minn,s[i].t);
}
if(tot==1)
return maxn-minn;
}
return -1;
}
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
return s*w;
}
int main()
{
n=read();
m=read();
for(int i=1;i<=m;i++)
{
s[i].l=read();
s[i].r=read();
s[i].t=read();
}
sort(s+1,s+m+1,comp);
for(int i=1;i<=m;i++)
{
if(s[i+n-2].t-s[i].t>ans) continue;
int num=k(i);
if(num!=-1)
{
b=true;
ans=min(num,ans);
}
else break;
}
if(!b) printf("-1");
else printf("%d",ans);
return 0;
}