洛谷P1273 有線電視網 樹上分組揹包

2022-04-30 07:27:12 字數 2500 閱讀 3500

某收費有線電視網計畫轉播一場重要的足球比賽。他們的轉播網和使用者終端構成一棵樹狀結構,這棵樹的根結點位於足球比賽的現場,樹葉為各個使用者終端,其他中轉站為該樹的內部節點。

從轉播站到轉播站以及從轉播站到所有使用者終端的訊號傳輸費用都是已知的,一場轉播的總費用等於傳輸訊號的費用總和。

現在每個使用者都準備了一筆費用想**這場精彩的足球比賽,有線電視網有權決定給哪些使用者提供訊號而不給哪些使用者提供訊號。

寫乙個程式找出乙個方案使得有線電視網在不虧本的情況下使**轉播的使用者盡可能多。

輸入格式:

輸入檔案的第一行包含兩個用空格隔開的整數n和m,其中2≤n≤3000,1≤m≤n-1,n為整個有線電視網的結點總數,m為使用者終端的數量。

第乙個轉播站即樹的根結點編號為1,其他的轉播站編號為2到n-m,使用者終端編號為n-m+1到n。

接下來的n-m行每行表示—個轉播站的資料,第i+1行表示第i個轉播站的資料,其格式如下:

k a1 c1 a2 c2 … ak ck

k表示該轉播站下接k個結點(轉播站或使用者),每個結點對應一對整數a與c,a表示結點編號,c表示從當前轉播站傳輸訊號到結點a的費用。最後一行依次表示所有使用者為**比賽而準備支付的錢數。

輸出格式:

輸出檔案僅一行,包含乙個整數,表示上述問題所要求的最大使用者數。

輸入樣例#1:

5 32 2 2 5 3

2 3 2 4 3

3 4 2

輸出樣例#1:

樣例解釋

如圖所示,共有五個結點。結點①為根結點,即現場直播站,②為乙個中轉站,③④⑤為使用者端,共m個,編號從n-m+1到n,他們為**比賽分別準備的錢數為3、4、2,從結點①可以傳送訊號到結點②,費用為2,也可以傳送訊號到結點⑤,費用為3(第二行資料所示),從結點②可以傳輸訊號到結點③,費用為2。也可傳輸訊號到結點④,費用為3(第三行資料所示),如果要讓所有使用者(③④⑤)都能看上比賽,則訊號傳輸的總費用為:

2+3+2+3=10,大於使用者願意支付的總費用3+4+2=9,有線電視網就虧本了,而只讓③④兩個使用者看比賽就不虧本了。

首先,樹形結構,應該可以看出來吧

其次,題目中給了我們乙個條件,就是收取的費用一定要大於等於建造的費用

所以可以看做是乙個揹包

樹上揹包!!!

具體是什麼揹包呢?

我們把每個節點所選的使用者數看成乙個個元素,比如選乙個使用者是乙個元素,選兩個使用者也是乙個元素,其中這些元素是互斥的,熟悉揹包的同學應該已經看出來了

分組揹包:有若干組物品,其中每組物品都只能選乙個

那麼在這道題中,容量就是以乙個節點為根的子樹的節點數,組數就是子節點的個數,我們要做的就是列舉每一組中的元素選擇多少個客戶

設\(dp[i][j]\)為以i為根的子樹中選擇j個客戶的花費

目標狀態:\(max(i),dp[1][i]>=0\)

怎麼轉移?

\[dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]-w)

\]解釋一下,其中v是u的子節點,w是\(u\to v\)的花費,j和k都是列舉的選擇客戶的個數,但j的範圍是u的整個子樹的節點數,k是子節點的子樹的節點數

邊界

memset(dp,~0x3f,sizeof(dp));

for(rg int i=1;i<=n;i++) dp[i][0]=0;//每個節點都不選,花費當然是0

#include#define in(i) (i=read())

#define rg register

#define il extern inline

using namespace std;

const int n=3e3+10;

int read()

while(i>='0' && i<='9') ans=ans*10+(i^48),i=getchar();

return ans*f;

}int n,m,cur;

int to[n],nex[n],head[n],w[n];

int dp[n][n],v[n];

il void add(int a,int b,int c)

int dfs(int u,int sum=0)

for(rg int i=head[u];i;i=nex[i])

} }return sum;

}int main()

for(rg int i=n-m+1;i<=n;i++) in(v[i]);

for(rg int i=1;i<=n;i++) dp[i][0]=0;

dfs(1);

for(rg int i=m;i>=1;i--)

if(dp[1][i]>=0) cout

有線電視網 洛谷p1273

某收費有線電視網計畫轉播一場重要的足球比賽。他們的轉播網和使用者終端構成一棵樹狀結構,這棵樹的根結點位於足球比賽的現場,樹葉為各個使用者終端,其他中轉站為該樹的內部節點。從轉播站到轉播站以及從轉播站到所有使用者終端的訊號傳輸費用都是已知的,一場轉播的總費用等於傳輸訊號的費用總和。現在每個使用者都準備...

有線電視網 洛谷 P1273

只能想到n 3的辦法 一看資料量自閉了。看了題解也是n 3 智障出題人 dp i j 代表以i為根的子樹選j個使用者時得到的最大收益 然後就是樹上揹包轉移一下 最後看根節點上最多選幾個人不虧本 include include include using namespace std const int...

有線電視網 洛谷P1273

題目描述 某收費有線電視網計畫轉播一場重要的足球比賽。他們的轉播網和使用者終端構成一棵樹狀結構,這棵樹的根結點位於足球比賽的現場,樹葉為各個使用者終端,其他中轉站為該樹的內部節點。從轉播站到轉播站以及從轉播站到所有使用者終端的訊號傳輸費用都是已知的,一場轉播的總費用等於傳輸訊號的費用總和。現在每個使...