bzoj 4033
2024-09-02 02:48:29
树形DP,dp[i][j]表示i子树中,选了j个白点,i子树中所有边的贡献。
/**************************************************************
Problem: 4033
User: idy002
Language: C++
Result: Accepted
Time:6568 ms
Memory:32492 kb
****************************************************************/ #include <cstdio>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define oo 0x3f3f3f3f3f3f3f3fLL
#define N 2010 typedef long long dnt; int n, m;
int head[N], next[N+N], dest[N+N], wght[N+N], etot;
dnt siz[N];
dnt dp[N][N], pp[N]; void adde( int u, int v, int w ) {
etot++;
wght[etot] = w;
dest[etot] = v;
next[etot] = head[u];
head[u] = etot;
}
void dfs( int u, int fa ) {
siz[u] = ;
for( int t=head[u]; t; t=next[t] ) {
int v=dest[t];
if( v==fa ) continue;
dfs( v, u );
siz[u] += siz[v];
}
int maxc = min( siz[u], m );
for( int c=; c<=maxc; c++ )
pp[c] = -oo;
pp[] = ;
for( int t=head[u]; t; t=next[t] ) {
int v=dest[t], w=wght[t];
if( v==fa ) continue;
for( int c=maxc; c>=; c-- ) {
int msc = min( c, siz[v] );
for( int sc=; sc<=msc; sc++ ) {
dnt tv = pp[c-sc]+dp[v][sc]+((dnt)sc*(m-sc)+(siz[v]-sc)*(n-m-siz[v]+sc))*w;
pp[c] = max( pp[c], tv );
}
}
}
dp[u][] = pp[];
for( int c=; c<=maxc; c++ )
dp[u][c] = max( pp[c], pp[c-] );
} int main() {
scanf( "%d%d", &n, &m );
if( n-m<m ) m=n-m;
for( int i=,u,v,w; i<n; i++ ) {
scanf( "%d%d%d", &u, &v, &w );
adde( u, v, w );
adde( v, u, w );
}
dfs(,);
printf( "%lld\n", dp[][m] );
}
最新文章
- CSS性能分析,如何优化CSS提高性能
- font-family常见字体
- node.js学习资料
- Bootstrap3.0学习第十四轮(分页、徽章)
- wp8 安装.Net3.5
- word中设置前几页为罗马数字,后几页设置为阿拉伯数字
- delphi 基础之三 编写和调用dll文件
- HDU 3533 Escape BFS搜索
- 安装cocoaPod 的问题
- Python学习之编写三级菜单(Day1,作业二)
- Liniux系统下目录的权限意义
- 如何禁止火狐onblur时alert()产生类似选中的拖蓝效果
- 版本名称GA的含义:SNAPSHOT->;alpha->;beta->;release->;GA
- Windows 查看端口占用情况
- SQL-1--语句分类
- Proxy --支持的拦截操作篇
- Vue.js项目集成ElementUI
- 第八周(3) Word2007样式
- IE和Firefox之间的JavaScript差异
- homework5 for java