标签:universal exit man ast color 更新 names space rsa
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<string> 5 #include<cstring> 6 #include<algorithm> 7 #include<iomanip> 8 using namespace std; 9 //f[i][t]表示以i为根,子树有t个点染黑的收益 10 //考虑对每一条边计算贡献:有几个点的路径上也包含这条边。 11 //f[x][j+t]=max(f[x][j+t],f[x][j]+f[y][t]+(long long)edge[i].dis*(t*(k-t)+(size[y]-t)*(n-k-(size[y]-t)))); 12 //最后更新size[x] 13 namespace Moxing{ 14 const int N=2005; 15 int n,k,last[N],cnt,size[N],son[N<<1]; 16 long long f[N][N]; 17 struct node{ 18 int to,dis,nxt; 19 }edge[N<<1]; 20 void add(int from,int to,int dis){ 21 edge[++cnt].to=to,edge[cnt].dis=dis,edge[cnt].nxt=last[from],last[from]=cnt; 22 } 23 void dfs(int x,int fa){ 24 // f[x][0]=f[x][1]=0; 25 size[x]=1; 26 for(int i=last[x];i;i=edge[i].nxt){ 27 int y=edge[i].to; 28 if(y==fa) continue ; 29 dfs(y,x); 30 for(int j=min(k,size[x]);j>=0;j--){ 31 for(int t=min(k-j,size[y]);t>=0&&(j+t)<=k;t--){// j+t<=k -> t<=k-j 32 f[x][j+t]=max(f[x][j+t],f[x][j]+f[y][t]+(long long)edge[i].dis*(t*(k-t)+(size[y]-t)*(n-k-(size[y]-t)))); 33 } 34 } 35 size[x]+=size[y]; 36 } 37 } 38 struct main{a 39 main(){ 40 scanf("%d%d",&n,&k); 41 for(int i=1;i<=n-1;i++){ 42 int from,to,dis; 43 scanf("%d%d%d",&from,&to,&dis); 44 add(from,to,dis),add(to,from,dis); 45 } 46 dfs(1,1); 47 printf("%lld\n",f[1][k]); 48 exit(0); 49 } 50 }UniversalLove; 51 } 52 int main(){ 53 Moxing::main(); 54 }
标签:universal exit man ast color 更新 names space rsa
原文地址:https://www.cnblogs.com/Moxingtianxia/p/11360384.html