本來是考慮, $ f[x][i][0/1] $ 表示 $ x $ 子樹中有$i$個黑點,且 $ x $ 是白點/黑點。但是這裡的答案是要統計不同的子樹的貢獻的。所以就gg了。
看了題解。
應該是要設$f[x][i]$表示$x$子樹中有$i$個黑點,對答案的貢獻。
轉移的時候,就可以單獨計算出$x->y$(y是x的兒子)這條邊的貢獻。
貢獻怎麼算呢?就是統計一下$y$內有多少黑(白)點、$y$外有多少黑(白)點,算一下有多少對,最後乘上$x->y$的邊權。
#include#include#include#includeusing namespace std;
#define ll long long
#define rg register
#define inf 0x3f3f3f3f
const int mx=4005;
template inline void read(_tp&x)
while(isdigit(c))if(b)x=-x;return;
}int n,k,cnt;
int head[mx],sz[mx];
ll f[mx][mx];
struct edgeedge[mx<<1];
inline void add_edge(int x,int y,int z)
void dfs(int x,int fa)
sz[x]+=sz[y];
}}int main()
memset(f,-inf,sizeof(f));
dfs(1,-1);
printf("%lld\n",f[1][k]);
return 0;
}
bzoj4033 HAOI2015 樹上染色
題目鏈結 有一棵點數為n的樹,樹邊有邊權。給你乙個在0 n之內的正整數k,你要在這棵樹中選擇k個點,將其染成黑色,並 將其他的n k個點染成白色。將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間距離的和的收益。問收益最大值是多少。第一行兩個整數n,k。接下來n 1行每行三個正整數fr,to...
bzoj4033 HAOI2015 樹上染色
有一棵點數為n的樹,樹邊有邊權。給你乙個在0 n之內的正整數k,你要在這棵樹中選擇k個點,將其染成黑色,並 將其他的n k個點染成白色。將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間距離的和的收益。問收益最大值是多少。輸入保證所有點之間是聯通的。n 2000,0 k n 來自 臥槽原來我...
BZOJ4033 HAOI2015 樹上染色
bzoj4033 haoi2015 樹上染色 試題描述 有一棵點數為n的樹,樹邊有邊權。給你乙個在0 n之內的正整數k,你要在這棵樹中選擇k個點,將其染成黑色,並 將其他的n k個點染成白色。將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間距離的和的收益。問收益最大值是多少。輸入 第一行兩...