Luogu1273 有線電視網(動態規劃)

2022-03-20 08:43:42 字數 1527 閱讀 9111

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

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

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

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

輸入格式:

輸入檔案的第一行包含兩個用空格隔開的整數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:

我還是太菜了。。。這種題都不會做。。。

設\(f[i][j]\)表示當前在\(i\)節點,選擇了\(j\)個使用者的最大獲利

轉移:\(f[i][j]=max(f[i][k]+f[son][j-k]-w_)\)

其中,\(w_\)是鏈結兒子節點的邊權

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define max 3100

inline int read()

struct line

e[max<<1];

int h[max],cnt=1;

int n,m,w[max];

int dg[max];

inline void add(int u,int v,int w)

; h[u]=cnt++;dg[u]++;

}int f[max][max];

int size[max];

void dfs(int u,int ff)

if(w[u]) }

int main()

} for(int i=n-m+1;i<=n;++i)w[i]=read();

dfs(1,0);

int ans=0;

for(int i=m;i;--i)

if(f[1][i]>=0)

printf("%d\n",ans);

return 0;

}

題解 P1273 有線電視網

這題顯然是個樹形dp之樹上分組揹包,信心滿滿地寫出轉移方程後,發現 時間複雜度 o n 3 但仔細觀察了討論區和題解後,發現,這是 o n 2 的?於是我開始嘗試牙刷圖 分塊牙刷圖 菊花圖 掃帚圖。卡標算。燃鵝失敗了。證明 暫且先認為所有節點都會產生貢獻,這不會影響最壞複雜。考慮一下最裡面迴圈的過程...

有線電視網 洛谷p1273

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

有線電視網 洛谷 P1273

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