#80pts 求条
查看原帖
#80pts 求条
1013479
lyx128楼主2024/11/9 18:35
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2000;
int n;
ll m;
struct Edge{
	int v,w;
	int next;
}e[N<<1+5];
int head[N+5],cnt;
void add(int u,int v,int w){
	e[++cnt].v=v;
	e[cnt].w=w;
	e[cnt].next=head[u];
	head[u]=cnt;
	return ;
}
ll u,v,w;
bool vis[N+5];
ll dp[N+5][N+5];
ll sz[N+5];

void dfs(int x){
	for(int i=head[x];i;i=e[i].next){
		int v=e[i].v;
		int w=e[i].w;
		if(!vis[v]){
			vis[v]=1;
			dfs(v);
			for(int j=max(m,sz[x]);j>=0;j--)
				for(int k=max(j-sz[x]+sz[v],(ll)0);k<=min((ll)j,sz[v]);k++){
					ll tot=(k*(m-k)+(sz[v]-k)*(n-m-sz[v]+k));
					dp[x][j]=max(dp[x][j],dp[x][j-k]+dp[v][k]+tot*w);
				}
		}
	}
	return ;
}
void calsize(int x){
	for(int i=head[x];i;i=e[i].next){
		int v=e[i].v;
		int w=e[i].w;
		if(!vis[v]){
			vis[v]=1;
			calsize(v);
			sz[x]+=sz[v];
		}
	}
	return ;
}
int main(){
	//freopen("D:\\样例数据包\\P3177_1.in","r",stdin);
    if (n-m<m) m=n-m;
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<n;i++){
		cin>>u>>v>>w;
		add(u,v,w);
		add(v,u,w);
	}
	vis[1]=1;
	for(int i=1;i<=n;i++)
		sz[i]=1;
	calsize(1);
	memset(vis,0,sizeof(vis));
	vis[1]=1;
	dfs(1);
	cout<<dp[1][m];
	return 0;
} 
2024/11/9 18:35
加载中...