1為根節點,有m個葉節點,其他為中間結點,每個結點的權值代表他願意付出的錢,邊的權值代表聯通兩節點的代價,求不虧損的情況下最多能到達多少個葉節點。
另dp[u][i]表示根節點為u的子樹此時裝了i個葉節點的盈利情況(∑m
oney
i−∑e
dgec
osti
) 那麼我們就能得到這樣的狀態轉移方程:
如果u是葉節點dp
[u][
1]=1
如果u是根節點dp
[u][
j]=m
ax(d
p[u]
[j],
dp[u
][j−
num]
+dp[
v][n
um]−
cost
uv,v是u的兒子節點。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define ll long long
#define lowbit(x) ((x)&(-x))
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1|1
#define mp(a, b) make_pair(a, b)
const
int inf = 0x3f3f3f3f;
const
int maxn = 1e4 + 7;
const
double eps = 1e-8;
const
int mod = 1000000009;
const
double pi = acos(-1.0);
vector
int, int> > g[maxn];
int a[maxn], dp[maxn][maxn];
int n, m, tot;
int sum[maxn];
void init(int u, int fa)
}}void dfs(int u, int fa, int pre)
else}}
}int main()
}for (int i = n - m + 1; i <= n; i++)
scanf("%d", &a[i]);
init(1, -1);
dfs(1, -1, 0);
for (int i = m; i >= 0; i--)}}
return
0;}
樹形揹包 POJ1155TELE
某收費有線電視網計畫轉播一場重要的足球比賽。他們的轉播網和使用者終端構成一棵樹狀結構,這棵樹的根結點位於足球比賽的現場,樹葉為各個使用者終端,其他中轉站為該樹的內部節點。從轉播站到轉播站以及從轉播站到所有使用者終端的訊號傳輸費用都是已知的,一場轉播的總費用等於傳輸訊號的費用總和。現在每個使用者都準備...
poj1155 TELE(樹形 揹包dp)
題意 某電台要廣播一場比賽,該電台網路是由n個網點組成的一棵樹,其中m個點為客戶端,其餘點為 站。客戶端i願支付的錢為pay i 每一條邊需要的花費固定,問電台在保證不虧損的情況下,最多能使多少個客戶端接收到資訊?思路 設dp i j 表示i節點為根節點並且子樹已經有j個使用者的時候最大剩餘費用。那...
POJ 1155 TELE 樹形揹包問題
題目描述看的莫名其妙,很久才看懂。就是很裸的樹形揹包問題吧,狀態是dp i,j 表示節點i取到j個客戶能得到的最大收益。注意一開始初始化的時候所有j為0的時候應該是0,然後其他值都要初始化成負無窮,因為收益有可能是負值。然後做01揹包的時候注意方向,防止出現取某乙個元素多次 include incl...