转载博客
写的很好了,这里只做记录:D
贴个代码
#include<bits/stdc++.h>
#define LL long long
#define INF INT64_MAX
#define MOD 998244353
#define ls rt << 1
#define rs rt << 1 | 1
using namespace std;
typedef pair<int,int>pa;
const int N = 1e5+7;
int vis[N], fa[N], d[N];
vector<int> g[N], rg[N];
struct node{
int id, val;
bool operator < (const node &x) const{
return val<x.val;
}
}a[N];
int Find(int x){
return x==fa[x]? x : fa[x] = Find(fa[x]);
}
void dfs(int x, int from, int idx){
d[x] = idx;
for(auto it:rg[x]){
if(it==from) continue;
dfs(it, x, idx+1);
}
}
int main(){
int n, m, k, _, u, v;
scanf("%d", &_);
while(_--){
scanf("%d", &n);
for(int i = 1;i <= n;i++){
g[i].clear();
rg[i].clear();
fa[i] = d[i] = 0;
}
for(int i = 1;i <= n-1;i++){
scanf("%d%d", &u, &v);
g[u].push_back(v);
g[v].push_back(u);
}
for(int i = 1;i <= n;i++){
scanf("%d", &a[i].val);
a[i].id = i;
}
sort(a+1, a+1+n);
for(int i = 1;i <= n;i++){
fa[a[i].id] = a[i].id;
for(auto it:g[a[i].id]){
if(fa[it]){
int fx = Find(it);
fa[fx] = a[i].id;
rg[fx].push_back(a[i].id);
rg[a[i].id].push_back(fx);
}
}
}
dfs(a[n].id, -1, 1);
for(int i = 1;i <= n;i++){
printf("%d\n", d[i]);
}
}
return 0;
}