传送门 Jumping Monkey
题意
在一颗树上,以k节点起始,能跳到v节点,然后接着跳。能跳 需满足条件:在k到v的最短路径上v节点点权最大。
问以u节点起始,能跳跃的最多多少个节点。
思路
并查集, 反向思考,从权值最小的开始枚举。
官方题解
ACcode
#include<bits/stdc++.h>
#define ll long long
#define ld long double
#define ull unsigned long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
ll gcd(ll a,ll b){ return b? gcd(b,a%b):a;}
const int N=2e5+10;
const ll P=1e9+7;
ll read(){
ll s = 0, f = 1; char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') f = -1;
ch = getchar();
}
while(isdigit(ch)) s = (s << 3) + (s << 1) + (ch ^ 48), ch = getchar();
return s * f;
}
using namespace std;
ll head[N],nex[N],var[N];
int vis[N];
ll sum[N];
ll value[N];
ll head1[N],nex1[N],var1[N];
ll cnt,cnt1;
ll fa[N];
void addedge(ll u,ll v){
var[++cnt]=v;
nex[cnt]=head[u];
head[u]=cnt;
}
void addedge1(ll u,ll v){
var1[++cnt1]=v;
nex1[cnt1]=head1[u];
head1[u]=cnt1;
}
void init(int n){
rep(i,0,n){
head[i]=0;
head1[i]=0;
cnt=0;
cnt1=0;
vis[i]=0;
sum[i]=0;
fa[i]=i;
}
}
ll find(ll x){
return x==fa[x] ? x:fa[x]=find(fa[x]);
}
void dfs(int n){
priority_queue < pair<ll,ll> > q;
rep(i,1,n){
q.push(make_pair(-value[i],i) );
}
while(!q.empty()){
int u=q.top().second;
vis[u]=1;
int x,y;
// cout<<"value:"<<-q.top().first<<endl<<v<<": ";
q.pop();
for(int i=head[u];i;i=nex[i]){
int v=var[i];
// cout<<u<<" ";
if(!vis[v]) continue;
x=find(u);
y=find(v);
if(x==y) continue;
// cout<<x<<" "<<y<<endl;
addedge1(x,y);
fa[y]=x;
// cout<<"add"<<endl;
}
// cout<<endl;
}
}
void dfstree(int root,int num){
sum[root]=num;
for(int i=head1[root];i;i=nex1[i]){
dfstree(var1[i],num+1);
}
return ;
}
void solve(){
int n;
int root;
n=read();
init(n);
int u,v;
rep(i,1,n-1){
u=read();
v=read();
addedge(u,v);
addedge(v,u);
}
ll maxs=0;
rep(i,1,n){
value[i]=read();
if(value[i] > maxs){
root=i;
maxs=value[i];
}
}
dfs(n);
// for(int i=1;i<=n;i++){
// for(int j=head1[i];j;j=nex1[j]){
// cout<<i<<"-->"<<var1[j]<<endl;
// }
// }
dfstree(root,1);
for(int i=1;i<=n;i++) cout<<sum[i]<<endl;
return ;
}
int main (){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T=read();
while(T--)
solve();
getchar();
getchar();
return 0;
}