LCA做法求调
查看原帖
LCA做法求调
762010
Lizj楼主2024/8/24 22:12

rt,WA求调

#include<bits/stdc++.h>
using namespace std;
int fa[100010][31],dep[100010],cst[100010][31];
int a[100010],t[100010];
struct edge{
	int to,w,nxt;
}e[200010];
int head[200010],cnt;
void add(int u,int v,int w){
	e[++cnt].to=v;
	e[cnt].w=w;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}
void dfs(int rt,int fn){
	fa[rt][0]=fn;
	dep[rt]=dep[fa[rt][0]]+1;
	for(int i=1;i<31;i++){
		fa[rt][i]=fa[fa[rt][i-1]][i-1];
		cst[rt][i]=cst[fa[rt][i-1]][i-1]+cst[rt][i-1];
	}
	for(int i=head[rt];i;i=e[i].nxt){
		if(e[i].to==fn)
			continue;
		cst[e[i].to][0]=e[i].w;
		dfs(e[i].to,rt);
	}
}
int lca(int x,int y){
	if(dep[x]>dep[y])
		swap(x,y);
	int tmp=dep[y]-dep[x],ans=0;
	for(int i=0;tmp;i++,tmp>>=1){
		if(tmp&1){
			ans+=cst[y][i];
			y=fa[y][i];
		}
	}
	if(y==x)
		return ans;
	for(int i=30;i>=0&&x!=y;i--){
		if(fa[x][i]!=fa[y][i]){
			x=fa[x][i];
			y=fa[y][i];
			ans+=cst[x][i]+cst[y][i];
		}
	}
	ans+=cst[x][0]+cst[y][0];
	return ans;
}
int main(){
	int T;
	cin>>T;
	while(T--){
		int n;
		cin>>n;
		for(int i=0;i<=n+1;i++)
			e[i].to=e[i].w=e[i].nxt=0;
		memset(head,0,sizeof(head));
		memset(a,0,sizeof(a));
		memset(t,0,sizeof(t));
		memset(fa,0,sizeof(fa));
		memset(dep,0,sizeof(dep));
		memset(cst,0,sizeof(cst));
		cnt=0;
		for(int i=1;i<n;i++){
			int u,v;
			cin>>u>>v;
			add(u,v,1);
			add(v,u,1);
		}
		dfs(1,0);
		cnt=0;
		a[++cnt]=1;
		t[a[cnt]]++;
		int lst=0;
		bool f=0;
		for(int i=2;i<=n;i++){
			if(t[i]==1)
				continue;
			if(lca(a[cnt],i)%2==1){
				a[++cnt]=i;
				t[a[cnt]]++;
				if(f){
					i=lst;
					f=0;
					continue;
				}
			}
			else{
				lst=i;
				f=1;
			}
		}
		f=0;
		for(int i=1;i<=n;i++){
			if(t[a[i]]!=1){
				cout<<-1<<endl;
				f=1;
				break;
			}
		}
		if(f)
			continue;
		for(int i=1;i<=cnt;i++)
			cout<<a[i]<<' ';
		cout<<endl;
	}
	return 0;
}
2024/8/24 22:12
加载中...