P3047求助
查看原帖
P3047求助
817864
kongwd楼主2023/3/12 10:41

我的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
2023/3/12 10:41
加载中...