#include #include #include #include using namespace std; const int MAXN=505; int n,f[MAXN][MAXN],ans[MAXN],sz[MAXN]; //f[i][j]表示i节点到它子树中距离i为j的节点最多能提供多少点能量 struct Edge { int to,next; }edge[MAXN<<1]; int head[MAXN],cnt=0; void add(int u,int v) { edge[++cnt].to=v; edge[cnt].next=head[u]; head[u]=cnt; } void dfs(int u,int fa) { f[u][0]=1; for(int i=1;i<=500;i++) f[u][i]=f[fa][i-1]; for(int i=head[u];i;i=edge[i].next) { int v=edge[i].to; if(v==fa) continue; dfs(v,u); for(int j=1;j<=500;j++) f[u][j]+=f[v][j-1]; } } void dfs1(int u,int fa) { for(int i=0;i<=500;i++) ans[u]+=f[u][i]; for(int i=head[u];i;i=edge[i].next) { int v=edge[i].to; if(v==fa) continue; for(int j=1;j<=500;j++) f[u][j]-=f[v][j-1]; for(int j=1;j<=500;j++) f[v][j]+=f[u][j-1]; dfs1(v,u); for(int j=1;j<=500;j++) f[v][j]-=f[u][j-1]; for(int j=1;j<=500;j++) f[u][j]+=f[v][j-1]; } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { int x; scanf("%d",&x); for(int j=0;j<=x;j++) f[i][j]=1; } for(int i=1;i<n;i++) { int u,v; scanf("%d%d",&u,&v); add(u,v); add(v,u); } dfs(1,0); dfs1(1,0); for(int i=1;i<=n;i++) printf("%d ",ans[i]); return 0; }

C++ 实现能量塔分配问题:树形结构节点能量计算

原文地址: https://www.cveoy.top/t/topic/lHVU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录