标签:dfs 防止 通过 clu 过多 add eof 节点 整数
输入示例
5 2 1 2 3 1 5 1 2 3 1 2 4 2
输出示例
17
1 #include<iostream> 2 #include<cstring> 3 #define ll long long 4 using namespace std; 5 int n,k; 6 int h[2010],e[4010],ne[4010],idx; 7 ll w[4010];int sum[2010]; 8 ll dp[2010][2010]; 9 void add(int a,int b,ll c) 10 { 11 ne[idx]=h[a]; 12 w[idx]=c; 13 e[idx]=b; 14 h[a]=idx++; 15 } 16 void dfs(int u,int fa) 17 { 18 sum[u]=1;int res=1;//res表示已经枚举过多少个子节点(res<=k) 19 dp[u][0]=dp[u][1]=0; 20 for(int p=h[u];p!=-1;p=ne[p]) 21 { 22 int j=e[p]; 23 if(j!=fa) 24 { 25 dfs(j,u); 26 sum[u]+=sum[j]; 27 for(int y=res;y>=0;y--)//枚举已经遍历过的子树中有多少黑节点 28 for(int i=min(k,sum[j]);i>=0;i--) 29 if(y+i<=k) 30 //dp[u][k+i] = max(dp[u][k+i], dp[j][i] + dp[u][k] + w[p] * ((ll)i * (k - i) + ((ll)sum[j] - i) * (n - k - sum[j] + i))); 31 dp[u][y+i]=max(dp[u][y+i],dp[u][y]+dp[j][i]+w[p]*((ll)i*(k-i)+((ll)sum[j]-i)*(n-k-sum[j]+i))); 32 res=min(k,res+sum[j]); 33 } 34 } 35 } 36 int main() 37 { 38 memset(h,-1,sizeof h); 39 cin>>n>>k; 40 for(int i=1;i<n;i++) 41 { 42 int a,b;ll c; 43 cin>>a>>b>>c; 44 add(a,b,c); 45 add(b,a,c); 46 } 47 dfs(1,0); 48 printf("%lld\n",dp[1][k]); 49 return 0; 50 }
标签:dfs 防止 通过 clu 过多 add eof 节点 整数
原文地址:https://www.cnblogs.com/flyljz/p/11955066.html