Inf年OI eps场空,忽略边界……
查看原帖
Inf年OI eps场空,忽略边界……
201971
william_zy楼主2022/9/24 23:03
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=2010;
ll n,k,hed[N],cnt,f[N],sz[N],dis[N],dp[N][N];
struct Edge{
	ll to,nxt,w;
}e[N<<1];
void add_edge(ll u,ll v,ll w){
	e[++cnt].to=v;
	e[cnt].nxt=hed[u];
	hed[u]=cnt;
	e[cnt].w=w;
}
void dfs_build(ll x,ll fa){
	f[x]=fa;
	sz[x]=1;
	for(ll i=hed[x];i;i=e[i].nxt){
		ll y=e[i].to;
		if(y==fa)continue;
		dis[y]=dis[x]+e[i].w;
		dfs_build(y,x);
		sz[x]+=sz[y];
	}
}
void dfs(ll x){
	dp[x][1]=0;
	dp[x][0]=0;
	for(ll i=hed[x];i;i=e[i].nxt){
		ll y=e[i].to;
		if(y==f[x])continue;
		dfs(y);
		for(ll j=min(sz[x],k);j>=0;j--){
			if(dp[x][j]!=-1){
				dp[x][j]+=dp[y][0]+sz[y]*(n-k-sz[y])*e[i].w;
			}
			for(ll kk=min(sz[y],j);kk>=max(
			1ll//Inf年OI eps场空,忽略边界见祖宗
			,j-(sz[x]-sz[y]));--kk){
				if(dp[x][j-kk]==-1)continue;
				dp[x][j]=max(dp[x][j],dp[x][j-kk]+dp[y][kk]+(kk*(k-kk)+(sz[y]-kk)*(n-k-sz[y]+kk))*e[i].w);
			}
		}
	}
}
main(){
	memset(dp,-1,sizeof dp);
	scanf("%lld%lld",&n,&k);
	k=min(k,n-k);
	for(ll i=1;i<n;i++){
		ll u,v,w;
		scanf("%lld%lld%lld",&u,&v,&w);
		add_edge(u,v,w);
		add_edge(v,u,w);
	}
	dfs_build(1,0);
	dfs(1);
	cout<<dp[1][k]<<endl;
}

为什么38行不能改成 0ll ,而必须在前面初始化???

2022/9/24 23:03
加载中...