代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include<cstring>
#include<algorithm>
#include<queue>
#include<set>
#include<deque>
#include<map>
using namespace std;
namespace code{
constexpr int N=50005,M=200005;
using ll=long long;
using ull=unsigned long long;
#define F(i,x,y) for(int i=(x),__tt2__=(y);i<=__tt2__;i++)
#define R(i,x,y) for(int i=(x),__tt2__=(y);i>=__tt2__;i--)
#define _F(i,x,y) for(int i=(x),__tt2__=(y);i<__tt2__;i++)
#define _R(i,x,y) for(int i=(x),__tt2__=(y);i>__tt2__;i--)
#define debug(x) cout<<#x<<'='<<(x)<<endl
int fa[N],rank[N];
int find(const int& x){
return (x==fa[x])?(x):(fa[x]=find(fa[x]));
}
void link(int x,int y){
x=find(x);
y=find(y);
if(rank[x]<rank[y]){
fa[x]=fa[y];
}
else {
fa[y]=fa[x];
rank[y]+=(rank[x]==rank[y]);
}
}
struct way{
int u,v,w;
constexpr way(const int& _u=0,const int& _v=0,const int& _w=0):u(_u),v(_v),w(_w){}
}a[M];
void sort(way a[],const int& size){
int cnt[256];
way* temp=new way[size+1];
for(int i=0;i<=8;i+=8){
memset(cnt,0,sizeof(cnt));
for(way* s=a;s<a+size;s++){
cnt[(s->w>>i)&255]++;
}
F(j,1,255){
cnt[j]+=cnt[j-1];
}
for(way* s=a+size-1;s>=a;s--){
temp[--cnt[(s->w>>i)&255]]=*s;
}
_F(j,0,size)a[j]=temp[j];
}
}
bool check(const int& max,const int& min,const int& n,const int& m){
F(i,1,n)fa[i]=i;
int tot=0;
_F(i,0,m){
if((a[i].w>max)||(a[i].w<min)||(find(a[i].v)==find(a[i].u)))continue;
tot++;
link(a[i].u,a[i].v);
if(tot==n-1)break;
}
return tot==n-1;
}
signed main(){
int n,m;
cin>>n>>m;
_F(i,0,m){
cin>>a[i].u>>a[i].v>>a[i].w;
}
sort(a,m);
int l1=0,l2=0,r1=10005,r2=10005,mid1,mid2,ans=114514,tmp;
while(l1<=r1){
mid1=(l1+r1)>>1;
l2=0;
r2=10005;
tmp=ans;
while(l2<=r2){
mid2=(l2+r2)>>1;
if(mid2<mid1){
l2=mid2+1;
}
else if(check(mid2,mid1,n,m)){
ans=min(mid2-mid1,ans);
r2=mid2-1;
}
else l2=mid2+1;
}
if(tmp==ans)r1=mid1-1;
else l1=mid1+1;
}
cout<<ans;
return 0;
}
}
signed main(){return code::main();}
WA 了 3 个点