我的dp1数组没问题,疑是59、60行累加出错导致输出错误(虽然我看不出任何问题),路过大佬帮忙看看是怎么回事????
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
struct Tree{
int to,nxt;
}a[N*2];
int n,k,tot=0;
int dp1[N][25],h[N],ans;
bool vis[N];
void add(int u,int v){
a[++tot].nxt=h[u];
a[tot].to=v;
h[u]=tot;
}
void dfs1(int u){
vis[u]=1;
for(int i=h[u];i!=0;i=a[i].nxt){
int v=a[i].to;
if(vis[v]) continue;
dfs1(v);
for(int j=1;j<=k;j++){
dp1[u][j]+=dp1[v][j-1];
}
}
}
void dfs2(int u){
vis[u]=1;
for(int i=h[u];i!=0;i=a[i].nxt){
int v=a[i].to;
if(vis[v]) continue;
for(int j=k;j>=2;j--){
dp1[v][j]-=dp1[v][j-2];
}
for(int j=1;j<=k;j++){
dp1[v][j]+=dp1[u][j-1];
}
dfs2(v);
}
}
int main(){
scanf("%d%d",&n,&k);
memset(h,0,sizeof(h));
for(int i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
memset(dp1,0,sizeof(dp1));
for(int i=1;i<=n;i++){
scanf("%d",&dp1[i][0]);
}
memset(vis,0,sizeof(vis));
dfs1(1);
memset(vis,0,sizeof(vis));
dfs2(1);
for(int i=1;i<=n;i++){
ans=0;
for(int j=0;j<=k;j++){
ans+=dp1[i][j];
}
printf("%d\n",&ans);
}
return 0;
}
附:离谱的输出(输入即样例)
124900136
124900136
124900136
124900136
124900136
124900136