題意:給定一棵樹,n個節點,其中有m個葉子表示的是使用者,其他點表示中轉器, 每條邊都有權值,每個使用者i願意給的錢w[i],問如果在不虧錢的情況下能為多少使用者轉播足球比賽?
思路:其實就是要選出部分葉子節點,其花費=所選葉子權值 - 經過的所有邊權(每條邊只算1次花費)。
那麼對於每個節點,可以考慮在其子樹下選擇1~k個葉子節點,記錄下dp值(是個最優值)。那麼就需要列舉所有可能了。複雜度貌似在極端情況下還是挺高的,比如單鏈1000個節點+2000個葉子節點的情況,不會算複雜度,每個非葉子節點中有兩個for迴圈,全按上限來算接近o(n3)。
1ac**//#include
2 #include 3 #include 4 #include 5
#define pii pair6
#define inf 0x3f3f3f3f
7#define ll long long
8using
namespace
std;
9const
int n=3010;10
11struct
node12;
15 node(int
from,int to,int val,int next):from(from
),to(to),val(val),next(next){};
16 }edge[n*2
];17
inthead[n], n, m, edge_cnt;
18void add_node(int
from,int to,int
val)
1923
24int
dp[n][n], mon[n];
25int dfs(int t,int
cost)
2639
if(sum==0)40
44return
sum;45}
4647
intmain()
4866}67
for(int i=n-m+1; i<=n; i++) //
使用者肯交的錢
68 scanf("
%d",&mon[i]);
6970 dfs(1,0
);71
for(int i=m; i>=0; i--)
72if(dp[1][i]>=0) 73}
74return0;
75}7677 ac**
poj1155 TELE(樹形 揹包dp)
題意 某電台要廣播一場比賽,該電台網路是由n個網點組成的一棵樹,其中m個點為客戶端,其餘點為 站。客戶端i願支付的錢為pay i 每一條邊需要的花費固定,問電台在保證不虧損的情況下,最多能使多少個客戶端接收到資訊?思路 設dp i j 表示i節點為根節點並且子樹已經有j個使用者的時候最大剩餘費用。那...
POJ 1155 TELE 樹形揹包
1為根節點,有m個葉節點,其他為中間結點,每個結點的權值代表他願意付出的錢,邊的權值代表聯通兩節點的代價,求不虧損的情況下最多能到達多少個葉節點。另dp u i 表示根節點為u的子樹此時裝了i個葉節點的盈利情況 m oney i e dgec osti 那麼我們就能得到這樣的狀態轉移方程 如果u是葉...
樹形揹包 POJ1155TELE
某收費有線電視網計畫轉播一場重要的足球比賽。他們的轉播網和使用者終端構成一棵樹狀結構,這棵樹的根結點位於足球比賽的現場,樹葉為各個使用者終端,其他中轉站為該樹的內部節點。從轉播站到轉播站以及從轉播站到所有使用者終端的訊號傳輸費用都是已知的,一場轉播的總費用等於傳輸訊號的費用總和。現在每個使用者都準備...