樹上染色
有一棵點數為n的樹,樹邊有邊權。給你乙個在0~n之內的正整數k,你要在這棵樹中選擇k個點,將其染成黑色,並
將其他的n-k個點染成白色。將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間距離的和的收益。
問收益最大值是多少。
input
第一行兩個整數n,k。
接下來n-1行每行三個正整數fr,to,dis,表示該樹中存在一條長度為dis的邊(fr,to)。
輸入保證所有點之間是聯通的。
n<=2000,0<=k<=n
output
輸出乙個正整數,表示收益的最大值。
sample input
5 2sample output1 2 3
1 5 1
2 3 1
2 4 2
17【樣例解釋】
將點1,2染黑就能獲得最大收益。
一道河北省選題,樹形dp,寫**的時候注釋都寫上去了,f[i][j]表示以i為根,選了j個黑點的最大值。
1 #include2 #include3 #include4 #include5 #include6using
namespace
std;
78 typedef long
long
ll;9
const ll inf=1e16+7;10
const
int nn=2007;11
12int
n,k;
13int
size[nn];
14int cnt=0,head[nn],next[nn*2],rea[nn*2],val[nn*2
];15
ll f[nn][nn];
1617
void add(int u,int v,int
fee)
1825
void dfs(int u,int
fa)2645}
46}47}
48void
init()
4958
for (int i=1;i<=n;i++)
59for (int j=1;j<=n;j++)
60 f[i][j]=-inf;
61 dfs(1,-1
);62 printf("
%lld\n
",f[1][k]);//
1為根節點。 63}
64int
main()
65
BZOJ 4033 樹上染色
bzoj 4033 傳送門 此題用到了計算貢獻的方法,將 多條路徑的路徑和 sum w i cnt i 這樣我們由找出所有路徑再計算轉化成了對每條邊計算其的貢獻 由於所有節點只用2種選擇,接下來就是比較套路的樹形dp了 設 dp i j 為在以 i 為根的子樹中,有 j 個黑點時的 max 這樣按照...
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 來自 臥槽原來我...