rt,最后 4 个大数据 AC 了。然后前面听取 WA 声一片。
已经判断自环了。
int n,m;
struct edge{
int intre,u,v,z;
inline bool operator < (const edge b){
return z<b.z;
}
}e[maxn];
struct LCT{
int ise,u,v,z,mu,mv,mz,tag;
LCT *fa,*son[2];
}*null,*ptr[maxn+50005],node[maxn+50005];
inline bool notroot(LCT *x){ return x->fa->son[0]==x || x->fa->son[1]==x; }
inline void update(LCT *x){
x->mz=inf;
if(x->son[0]->mz<x->mz) x->mz=x->son[0]->mz,x->mu=x->son[0]->mu,x->mv=x->son[0]->mv;
if(x->son[1]->mz<x->mz) x->mz=x->son[1]->mz,x->mu=x->son[1]->mu,x->mv=x->son[1]->mv;
if(x->ise && x->z<x->mz) x->mz=x->z,x->mu=x->u,x->mv=x->v;
}
inline void Rev(LCT *x){ std::swap(x->son[0],x->son[1]),x->tag^=1; }
inline void push_down(LCT *x){
if(x->tag){
if(x->son[0]!=null) Rev(x->son[0]);
if(x->son[1]!=null) Rev(x->son[1]);
x->tag=0;
}
}
inline bool get_which(LCT *x){ return x->fa->son[1]==x; }
void rotate(LCT *x){
LCT *y=x->fa,*z=y->fa;
int k=get_which(x);
LCT *w=x->son[!k];
if(notroot(y)) z->son[get_which(y)]=x; x->son[!k]=y,y->son[k]=w;
if(w!=null) w->fa=y; y->fa=x,x->fa=z;
update(y),update(x);
}
void splay(LCT *x){
LCT *now=x;
std::stack<LCT*>st;
st.push(now);
while(notroot(now)) st.push(now=now->fa);
while(st.size()) push_down(st.top()),st.pop();
while(notroot(x)){
LCT *y=x->fa,*z=y->fa;
if(notroot(y)) rotate(get_which(x)^get_which(y)?x:y);
rotate(x);
}
update(x);
}
inline void access(LCT *x){
LCT *y=null;
while(x!=null){
splay(x);
x->son[1]=y;
update(x);
y=x,x=x->fa;
}
}
inline LCT* findroot(LCT *x){
access(x),splay(x);
while(x->son[0]!=null)
push_down(x),x=x->son[0];
splay(x);
return x;
}
inline void makeroot(LCT *x){ access(x),splay(x),Rev(x); }
inline void split(LCT *x,LCT *y){ makeroot(x),access(y),splay(y); }
inline void Link(LCT *x,LCT *y){ makeroot(x);if(findroot(y)!=x) x->fa=y; }
inline void Cut(LCT *x,LCT *y){
makeroot(x);
if(findroot(y)==x && y->fa==x && y->son[0]==null){
y->fa=x->son[1]=null,update(x);
// puts("I did it.");
}
}
/*
struct LCT{
int ise,u,v,z,mu,mv,mz,tag;
LCT *fa,*son[2];
}*null,*ptr[5005],node[5005];
*/
int cnt,minit,ans=inf;
bool vis[maxn];
std::map< std::pair<int,int>,int >map;
signed main(){
// freopen("simpleinput.txt","r",stdin);
node[maxn+50004]=(LCT){0,0,0,inf,0,0,inf,0,NULL,NULL,NULL};
null=&node[maxn+50004];
read(n),read(m);
for(int i=1;i<=n;++i){
node[i]=(LCT){0,0,0,inf,0,0,inf,0,null,null,null};
ptr[i]=&node[i];
}
for(int i=1;i<=m;++i){
read(e[i].u),read(e[i].v),read(e[i].z);
if(e[i].u==e[i].v) i--,m--;
}
// write(m);
int it=n;
std::sort(e+1,e+m+1);
for(int i=1;i<=m;++i){
++it;
map[std::make_pair(e[i].u,e[i].v)]=i;
map[std::make_pair(e[i].v,e[i].u)]=i;
node[it]=(LCT){1,e[i].u,e[i].v,e[i].z,e[i].u,e[i].v,e[i].z,0,null,null,null};
ptr[it]=&node[it];
}
for(int i=1;i<=m;++i){
int u=e[i].u,v=e[i].v;
if(findroot(ptr[u])!=findroot(ptr[v])){
Link(ptr[u],ptr[n+i]);
Link(ptr[n+i],ptr[v]);
cnt++,vis[i]=1;
}else{
split(ptr[u],ptr[v]);
int u1=ptr[v]->mu,v1=ptr[v]->mv,a1=map[std::make_pair(u1,v1)];
Cut(ptr[u1],ptr[n+a1]),Cut(ptr[n+a1],ptr[v1]);
Link(ptr[u],ptr[n+i]),Link(ptr[n+i],ptr[v]);
vis[a1]=0,vis[i]=1;
}
if(cnt==n-1){
while(!vis[minit]) ++minit;
ans=std::min(ans,e[i].z-e[minit].z);
}
}
write(ans),putchar('\n');
return 0;
}