蒟蒻WA #4#5 75分
查看原帖
蒟蒻WA #4#5 75分
135258
charm1楼主2021/3/22 14:34

RT

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2005;
int n,m,cnt;
int dp[maxn][maxn],head[maxn],siz[maxn];
struct edge{
	int v,nxt,val;
}a[maxn<<1];
void add(int x,int y,int val){
	++cnt;
	a[cnt].v  =y;
	a[cnt].val=val;
	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 dfs(int x,int f,int len){
	for(int k=head[x];k;k=a[k].nxt){
		int v=a[k].v,val=a[k].val;
		if(v==f)    continue;
		dfs(v,x,val);
		siz[x]+=siz[v];
		for(int j=min(m,siz[x]);j>=0;j--)
		for(int i=0;i<=min(j,siz[v]);i++)
		dp[x][j]=max(dp[x][j],dp[x][j-i]+dp[v][i]);
	}
	siz[x]++;
	for(int k=1;k<=siz[x]&&k<=m;k++)
	dp[x][k]=max(dp[x][k],dp[x][k-1]);
//	cout<<x<<endl;
//	for(int k=0;k<=siz[x]&&k<=m;k++)    cout<<dp[x][k]<<" ";
//	cout<<endl;
	for(int k=0;k<=siz[x]&&k<=m;k++){
		int b,w,sb,sw;
		b=k;    w=siz[x]-k;
		sb=m;   sw=n-m;
		dp[x][k]+=(b*(sb-b)+w*(sw-w))*len;
//		cout<<dp[x][k]<<" ";
	}
//	cout<<endl;
}
void scan(){
	n=read();   m=read();
	for(int k=1;k<n;k++){
		int x,y,val;
		x=read();   y=read();   val=read();
		add(x,y,val);   add(y,x,val);
	}
}
void solve(){
	dfs(1,0,0);
	printf("%lld\n",dp[1][m]);
}
signed main(){
	scan(); solve();
	return 0;
}
/*
7 1
1 2 1
2 3 1
3 4 1
4 5 1
5 6 1
6 7 1
*/
2021/3/22 14:34
加载中...