求助
  • 板块灌水区
  • 楼主jr_syc
  • 当前回复8
  • 已保存回复8
  • 发布时间2021/11/4 13:26
  • 上次更新2023/11/4 01:28:14
查看原帖
求助
544109
jr_syc楼主2021/11/4 13:26
#include<bits/stdc++.h>
#define ll long long
#define rg register ll
using namespace std;
const ll M=50005,N=6e7+5;
ll n,m,b[M][1305],h[M],v[M],w[M],c[M],d[M],f1[M],f[N],mm;
inline ll max(ll x,ll y){
	return x>y?x:y;
}
inline ll dfs(int x){
	ll m2=m;
	for(rg i=1;i<=b[x][0];++i) dfs(b[x][i]);
	m++;
	c[m]=w[x];
	d[m]=v[x];
	f1[m]=m2;
}
int main(){
	freopen("treebag.in","r",stdin);
	freopen("treebag.out","w",stdout);
	cin>>m>>n;
	for(rg i=1;i<=m;++i) cin>>h[i];
	for(rg i=1;i<=m;++i) cin>>w[i];
	for(rg i=1;i<=m;++i) cin>>v[i];
	for(rg i=1;i<=m;++i){
		if(h[i]!=0){
			b[h[i]][0]++;
			b[h[i]][b[h[i]][0]]=i;
		}
	}
	mm=m;
	m=0;
	for(rg i=1;i<=mm;++i) if(h[i]==0) dfs(i);
	for(rg i=1;i<=m;++i){
		for(rg j=n;j>=1;--j){
			if(j>=c[i]) f[i*(n+1)+j]=max(f[f1[i]*(n+1)+j],f[(i-1)*(n+1)+j-c[i]]+d[i]);
			else f[i*(n+1)+j]=f[f1[i]*(n+1)+j];
		}
	}
	cout<<f[m*(n+1)+n];
}

上面是此蒟蒻树形背包的代码,时超挂掉了。求助

2021/11/4 13:26
加载中...