#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N =210;
ll power=0;
int n;
int h[N],to[N],ne[N],idx;
void add( int a,int b){
to[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int order[N];
int cnt=0;
void get_order(int rt,int fa){
order[rt]=++cnt;
for( int i=h[rt];i!=-1;i=ne[i]){
int j=to[i];
if(j==fa) continue;
get_order(j,rt);
}
return ;
}
ll ans[N];
ll get_rand(int fa){
ll res=0;
for( int i=0;i<60;i++){
if((ans[fa]&(1ll<<i))==0&&fa!=0)
res+=(1ll<<i);
else
res+=((abs(rand())&1ll)<<i);
}
return res;
}
int check( int rt,int fa){
if(rt==1) return true;
for( int i=1;i<=n;i++){
if(order[i]<order[rt] &&(ans[i]|ans[rt])==power&&i!=fa) return false;
}
return true;
}
int solve(int rt,int fa){
begin:
ans[rt]=get_rand(fa);
int tot=0;
while(check(rt,fa)==0){
ans[rt]=get_rand(fa);
if(++tot>100) return -1;
}
for( int i=h[rt];i!=-1;i=ne[i]){
int j=to[i];
if(j==fa) continue;
if(solve(j,rt)==-1) {
if(rand()%5!=0)
goto begin;
else return -1;
}
}
return 1;
}
int main(){
srand(time(0));
power=2;
for( int i=1;i<60;i++){
power*=2;
}
//这里注意pow函数不能计算longlong类型,也不能算int
power-=1;
memset(h,-1,sizeof(h));
cin>>n;
for( int i=1;i<=n-1;i++){
int a,b;
cin>>a>>b;
add(a,b),add(b,a);
}
get_order(1,-1);
while(solve(1,0)==-1);
for( int i=1;i<=n;i++){
cout<<ans[i]<<" ";
}
return 0;
}
icpc济南站2020 J概率算法
最新推荐文章于 2022-09-19 16:31:44 发布