sub的tle了
查看原帖
sub的tle了
513717
Str_ywr楼主2022/10/13 09:45
//代码有错 

#include<bits/stdc++.h>
#define maxn 2005
//#define int long long 
using namespace std;
int n,k; 
struct Edge{
	int v,next,w;
}edge[maxn<<1];//开2倍 
int head[maxn],size[maxn],cnt,vis[maxn];
long long f[maxn][maxn];
//int now=1;
//int m[maxn][maxn];
void add(int u,int v,int w){
	edge[++cnt].v=v;
	edge[cnt].next=head[u];
	edge[cnt].w=w;
	head[u]=cnt;
}
void tree_dp(int p){
	size[p]=1;
	vis[p]=1;
	f[p][0]=f[p][1]=0;//一定合法!!!,不能为-1,否则判定不合法 
	for(int i=head[p];i!=-1;i=edge[i].next){//!!!
		int v=edge[i].v;
		if(vis[v]) continue;
		tree_dp(v);
		size[p]+=size[v];
		for(int j=min(k,size[p]);j>=0;j--){
			for(int l=0;l<=min(j,size[v]);l++){//q1:为什么要从小到大
			//q2,源代码错了 
				if(f[p][j-l]==-1) continue;
				f[p][j]=max(f[p][j],f[v][l]+f[p][j-l]+1ll*edge[i].w*(1ll*l*(k-l)+1ll*(size[v]-l)*(n-k-size[v]+l)));//执行f[p][1]的时候,会用到f[p][0],但f[p][0]此时是加入v后的,不符合 
			}
		}
		
	}
}
signed main(){
	memset(f,-1,sizeof f);
	memset(head,-1,sizeof head);
	cin>>n>>k;
	int u,v,d;
	for(int i=1;i<n;i++){
		scanf("%d%d%d",&u,&v,&d);
		add(u,v,d); //应该加双边
		add(v,u,d); 
	}
	tree_dp(1);
	cout<<f[1][k];
	return 0;
}
2022/10/13 09:45
加载中...