思路简述,首先将一棵树按dfs序分成不同的链,类似树链剖分,然后对于链上的节点,我们有以下构造,第一条链上的差值为1,第二条链上的差值为4,第三条为6,然后依次为递增的非质数自然数,但是不知道为啥假了,求hack。
#include <algorithm>
#include <cstdint>
#include<iostream>
#include <cmath>
#include <vector>
#include<queue>
#include <climits>
#include <bitset>
#include <map>
using namespace std;
#define int long long
vector<int> vec[200010];
int val[200010];
bitset<400010> bt;
vector<int> pr;
map<int,int> n_pr;
int pos=1;
bool flag=1;
void euler()
{
int cnt=0;
bt.set();
bt[1]=0;
n_pr[++cnt]=1;
for(int i=2;i<=400000;i++)
{
if(bt[i]) pr.push_back(i);
for(int j=1;j<=pr.size()&&i*pr[j-1]<=400000;j++)
{
bt[i*pr[j-1]]=0;
n_pr[++cnt]=i*pr[j-1];
if(i%pr[j-1]==0) break;
}
}
}
void dfs(int u,int f,int pos)
{
val[u]=val[f]+n_pr[pos];
flag=0;
for(auto to:vec[u])
{
if(to==f) continue;
dfs(to,u,pos);
pos++;
}
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(nullptr),cout.tie(nullptr);
euler();
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++) vec[i].clear(),val[i]=0;
for(int i=1,x,y;i<n;i++)
cin>>x>>y,vec[x].push_back(y),vec[y].push_back(x);
flag=1;
dfs(1,0,1);
if(flag) cout<<-1;
else for(int i=1;i<=n;i++) cout<<val[i]<<' ';
cout<<'\n';
}
return 0;
}