重构树全WA求助
查看原帖
重构树全WA求助
304550
black_trees楼主2021/9/29 19:47

RT,不知道哪里写挂了呜呜

能过样例但就是过不了数据


#include<bits/stdc++.h>
using namespace std;

const int si_n=1e4+10;
const int si_m=5e4+10;
int n,m,q;

struct Kruskal{
	int u,v,w;
	bool operator < (const Kruskal &b)const{
		return w>b.w;
	}
}e[si_m];
int pa[si_n];
inline int root(int x){
	if(pa[x]!=x) return pa[x]=root(pa[x]);
	return pa[x];
}
inline bool Union(int x,int y){
	int rx=root(x),ry=root(y);
	if(rx==ry) return false;
	pa[rx]=ry;
	return true;
}

struct Tree{
	int ver,head,Next,w;
}t[si_m];
int val[si_n];
int cnt=0,tot=n;
inline void add(int u,int v,int w){
	t[++cnt].ver=v,t[cnt].Next=t[u].head;
	t[u].head=cnt,t[cnt].w=w;
}
int dep[si_n],f[si_n][20];
bool vis[si_n];
void dfs(int i,int fa){
    dep[i]=dep[fa]+1;
    vis[i]=true,f[i][0]=fa;
    for(register int j=1;j<18;++j){
        f[i][j]=f[f[i][j-1]][j-1];
    }
    for(register int j=t[i].head;j;j=t[j].Next){
        int v=t[j].ver;
        if(v==fa) continue;
        dfs(v,i);
    }
}
int lca(int u,int v){
    if(dep[u]<dep[v]) swap(u,v);
    for(register int i=19;i>=0;--i){
        if(dep[f[u][i]]>=dep[v]) u=f[u][i];
    }
    if(u==v) return u;
    for(register int i=19;i>=0;--i){
        if(f[u][i]!=f[v][i]){
            u=f[u][i],v=f[v][i];
        }
    }
    return f[u][0];
}
inline void insert(Kruskal p){
	int ru=root(p.u),rv=root(p.v);
	int k=++tot;val[k]=p.w;
	pa[k]=pa[ru]=pa[rv]=k;
	add(k,ru,1),add(ru,k,1);
	add(k,rv,1),add(rv,k,1);
}

int main(){
	scanf("%d%d",&n,&m);
	for(register int i=1;i<=n;++i){
		pa[i]=i;
	}
	for(register int i=1;i<=m;++i){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		e[i]=(Kruskal){u,v,w};	
	}
	sort(e+1,e+1+m);
	for(register int i=1;i<=m;++i){
		if(Union(e[i].u,e[i].v)) insert(e[i]);
	}
	for(register int i=1;i<=tot;++i){
		if(!vis[i]) dfs(root(i),0);
	}
	scanf("%d",&q);
	while(q--){
		int l,r;
		scanf("%d%d",&l,&r);
		if(root(l)!=root(r)) puts("-1");
		else printf("%d\n",val[lca(l,r)]);
	}
	return 0;
}
2021/9/29 19:47
加载中...