/*I think*/
#include <iostream>
#include <cstring>
#include <string>
#include<map>
#include<queue>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#define debug(a) cout<<#a<<"="<<a<<endl;
#define cd(a) scanf("%lld", &a)
#define ll long long
#define PII pair<int, int>
#define _for(i, a, b) for (int i = a; i < b; i++)
#define For(i, a, b) for (int i = a; i <= b; i++)
#define foR(i, b, a) for (int i = b; i >= a; i--)
#define ms(a,b) memset(a, b, sizeof a)
#define gcd(a, b) __gcd(a, b)
#define lcm(a, b) a / gcd(a, b) * b
#define INF 0x3f3f3f3f
using namespace std;
const int N = 2e5+10,mod=1000000007;
double eps=1e-7;
vector<int> e[N], id[2];
int ans[N];
void dfs(int u,int fa,int val){
id[val].push_back(u);
for(auto v:e[u]){
if(v!=fa){
dfs(v, u, val ^ 1);
}
}
}
void sov()
{
int n;
cin >> n;
For(i, 1, n) e[i].clear();
id[0].clear();
id[1].clear();
For(i,1,n-1){
int u, v;
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
vector<int> va[30];
for (int i = 1; i <=n;i++){
for (int j = 20; j >= 0;j--){
if(i&(1<<j)){
va[j].push_back(i);
break;
}
}
}
dfs(1, 1, 1);
if(id[0].size()>id[1].size())
swap(id[0], id[1]);
int len = id[0].size(), p = 0;
for (int i = 0; i <= 20;i++){
if (va[i].size() == (1 << i) && len&(1<<i) ){
// 去凑出来len个(小的肯定可以凑出来 )
for(auto t:va[i]){
ans[id[0][p++]] = t;
}
va[i].clear();
}
}
//把剩下的i放进去
p = 0;
for (int i = 0; i <= 20;i++){
for(auto t:va[i]){
ans[id[1][p++]] = t;
}
}
For(i,1,n)printf("%d ",ans[i]);
printf("\n");
}
signed main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int OvO;
cin >> OvO;
while(OvO--){
sov();
}
return 0;
}
D. Treelabeling 二分图染色
最新推荐文章于 2025-07-24 20:33:53 发布