有一棵點數為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 21 2 3
1 5 1
2 3 1
2 4 2
sample output
17【樣例解釋】
將點1,2染黑就能獲得最大收益。
思路:我們知道有道題,是求兩兩距離之和,我們可以一遍dfs得到,即每條邊的貢獻=sz[v]*(n-sz[v])*len[i];此題也一樣,我們用dp[u][x]表示以u為根的子樹裡有x個黑點的最大收益。 不難得到dp方程。
#includeusing namespace std;
#define maxn 2010
typedef long long ll;
struct edgeedge[maxn<<1];
int n,k,tot=0,siz[maxn],son[maxn],head[maxn];
ll dp[maxn][maxn];
void add(int u,int v,int w)
void dfs(int u,int pre)
} siz[u]+=siz[v]; }}
int main()
dfs(1,0);
printf("%lld\n",dp[1][k]);
return 0;
}
BZOJ 4033 樹上染色
bzoj 4033 傳送門 此題用到了計算貢獻的方法,將 多條路徑的路徑和 sum w i cnt i 這樣我們由找出所有路徑再計算轉化成了對每條邊計算其的貢獻 由於所有節點只用2種選擇,接下來就是比較套路的樹形dp了 設 dp i j 為在以 i 為根的子樹中,有 j 個黑點時的 max 這樣按照...
bzoj4033(樹上染色)
樹上染色 有一棵點數為n的樹,樹邊有邊權。給你乙個在0 n之內的正整數k,你要在這棵樹中選擇k個點,將其染成黑色,並 將其他的n k個點染成白色。將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間距離的和的收益。問收益最大值是多少。input 第一行兩個整數n,k。接下來n 1行每行三個正整...
bzoj4033 HAOI2015 樹上染色
題目鏈結 有一棵點數為n的樹,樹邊有邊權。給你乙個在0 n之內的正整數k,你要在這棵樹中選擇k個點,將其染成黑色,並 將其他的n k個點染成白色。將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間距離的和的收益。問收益最大值是多少。第一行兩個整數n,k。接下來n 1行每行三個正整數fr,to...