分析
一种构造方法是,使相邻层不可达
对
(
u
,
v
)
(u,v)
(u,v),若二进制下最高位不同,则满足
u
⊕
v
>
m
i
n
(
u
,
v
)
u⊕v>min(u,v)
u⊕v>min(u,v),则
u
,
v
u,v
u,v不可达
因此,将最高位相同的数放入奇
/
/
/偶层,相邻层最高位不同不可达
代码
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int N=2e5+9;
int T,n;
int ans[N],p[39];
vector<int>e[N],v[2],cnt[N];
void dfs(int x,int fa,int op)
{
v[op].pb(x);
for(auto y:e[x])
if(y!=fa)
dfs(y,x,op^1);
}
bool cmp(int x,int y)
{
return cnt[x].size()>cnt[y].size();
}
void solve()
{
cin>>n;
for(int i=1;i<=n;i++)
e[i].clear();
v[0].clear(); v[1].clear();
for(int i=1;i<33;i++)
p[i]=i,cnt[i].clear();
for(int i=1;i<n;i++)
{
int x,y;
cin>>x>>y;
e[x].pb(y); e[y].pb(x);
}
dfs(1,0,0);
int b=1;
for(int i=1;i<=n;i++)
{
if(i&(1<<b)) b++;
cnt[b].pb(i);
}
sort(p+1,p+1+b,cmp);
for(int i=1;i<=b;i++)
{
int op=1;
if(v[0].size()>v[1].size()) op=0;
while(cnt[p[i]].size())
{
ans[v[op].back()]=cnt[p[i]].back();
v[op].pop_back(); cnt[p[i]].pop_back();
}
}
for(int i=1;i<=n;i++)
cout<<ans[i]<<" ";
cout<<endl;
}
int main()
{
cin>>T;
while(T--) solve();
return 0;
}