蒟蒻84分WA求助,救救孩子
查看原帖
蒟蒻84分WA求助,救救孩子
135258
charm1楼主2021/4/24 10:46

RT

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=100005;
const int maxm=105;
int n,m,ans,cnt;
int head[maxn],deg[maxn],F[maxn],dp[maxn][maxm][2];
//0表示起点段,1表示终点段;
struct edge{
	int v,nxt;
}a[maxn<<1];
inline void add(int x,int y){
	++cnt;
	a[cnt].v  =y;
	a[cnt].nxt=head[x];
	head[x]=cnt;
}
inline int read(){
	int ret=0,f=1;	char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
	while(isdigit(ch)){ret=ret*10+ch-'0';ch=getchar();}
	return ret*f;
}
void scan(){
	n=read();   m=read();
	for(int k=1;k<=n;k++)   F[k]=read();
	for(int k=1;k<n;k++){
		int x,y;
		x=read();   y=read();
		add(x,y);   add(y,x);
		deg[x]+=F[y];
		deg[y]+=F[x];
	}
//	for(int k=1;k<=n;k++)	cout<<deg[k]<<" ";
//	cout<<endl;
}
void dfs(int x,int f){
	for(int k=1;k<=m;k++)	dp[x][k][0]=deg[x];
	for(int k=head[x];k;k=a[k].nxt){
		int v=a[k].v;
		if(v==f)    continue;
		dfs(v,x);
		for(int k=0;k<=m;k++)	ans=max(ans,dp[x][k][0]+dp[v][m-k][1]);
		for(int j=1;j<=m;j++)
		dp[x][j][0]=max(dp[x][j][0],dp[v][j][0]),
		dp[x][j][1]=max(dp[x][j][1],dp[v][j][1]),
		dp[x][j][0]=max(dp[x][j][0],dp[v][j-1][0]+deg[x]-F[v]);//刨去前驱
	}
	for(int k=m;k;k--)      dp[x][k][1]=max(dp[x][k][1],dp[x][k-1][1]+deg[x]-F[f]);//刨去前驱
}
void solve(){
	dfs(1,0);
	printf("%lld\n",ans);
}
signed main(){
	scan(); solve();
	return 0;
}
2021/4/24 10:46
加载中...