1. 程式人生 > >P1273 有線電視網(樹形dp)

P1273 有線電視網(樹形dp)

pre tchar view 樹葉 -m 中轉站 表示 getchar 數量

P1273 有線電視網

題目描述

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

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

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

寫一個程序找出一個方案使得有線電視網在不虧本的情況下使觀看轉播的用戶盡可能多。

輸入輸出格式

輸入格式:

輸入文件的第一行包含兩個用空格隔開的整數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的費用。最後一行依次表示所有用戶為觀看比賽而準備支付的錢數。

輸出格式:

輸出文件僅一行,包含一個整數,表示上述問題所要求的最大用戶數。

  • 顯然樹形dp,用f[i][j]表示對於節點i選擇它的j個兒子所得的最大收益
  • 最後答案即為使f[1][i]非負的最大的i
  • 代碼:
技術分享圖片
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 using namespace std;
 5 
 6 #define N (3000+100)
 7 #define res register int
 8 inline int read()
 9 {
10     int x(0),f(1); char ch;
11     while(!isdigit(ch=getchar())) if(ch==-) f=-1;
12     while(isdigit(ch)) x=x*10
+ch-0,ch=getchar(); 13 return f*x; 14 } 15 int head[N],ver[N],nxt[N],edge[N]; 16 int f[N][N],n,m;//在i節點,選j個用戶的最大收益 17 18 int tot; 19 inline void add(int x,int y,int z) 20 { 21 ver[++tot]=y; nxt[tot]=head[x]; head[x]=tot; edge[tot]=z; 22 } 23 24 int dfs(int x) 25 { 26 if(x>n-m) return 1; 27 int son(0); 28 for(res i(head[x]) ; i ; i=nxt[i]) 29 { 30 int y=ver[i]; 31 int tmp=dfs(y); son+=tmp; 32 for(res j(son) ; j>0 ; j--) 33 for(res k(1) ; k<=tmp ; k++) 34 if(k<=j) 35 f[x][j]=max(f[x][j],f[x][j-k]+f[y][k]-edge[i]); 36 } 37 return son; 38 } 39 40 int main() 41 { 42 n=read(); m=read(); 43 for(res x(1) ; x<=n-m ; x++) 44 { 45 int siz=read(); 46 for(res i(1) ; i<=siz ; i++) 47 { 48 int y=read(),z=read(); 49 add(x,y,z); 50 } 51 } 52 memset(f,~0x3f,sizeof(f)); 53 for(res i(1) ; i<=n ; i++) 54 f[i][0]=0; 55 for(res i(n-m+1) ; i<=n ; i++) 56 f[i][1]=read(); 57 dfs(1); 58 for(res i(m) ; i>=1 ; i--) 59 if(f[1][i]>=0) 60 return printf("%d\n",i),0; 61 return 0; 62 }
View Code

P1273 有線電視網(樹形dp)