有线电视网(洛谷-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的費用。最后一行依次表示所有用戶為觀看比賽而準備支付的錢數。
輸出格式:
輸出文件僅一行,包含一個整數,表示上述問題所要求的最大用戶數。
輸入輸出樣例
輸入樣例#1:
5 3
2 2 2 5 3
2 3 2 4 3
3 4 2
輸出樣例#1:
2
思路:樹形dp的分組背包問題
邊可以重復利用但是只付一次的費用,狀態不可能表示哪些邊選,既然每條邊不用重復計算,那就先算每個點在他的后代中選幾個點的費用,再計算父親的時候利用兒子的費用再加上它與兒子的邊權,用 dp[i][j] 表示在以 i 為根的子樹中,滿足 j 個客戶的需求所能獲得的最大收益,更新時將每個兒子掃一遍,并用當前搜到的兒子選的用戶數更新狀態,在最終求最多客戶時,只要求最大的 dp[1][i]>=0 的 i 即可
源代碼
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<set> #include<map> #include<stack> #include<ctime> #include<vector> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 3001 #define MOD 10007 #define E 1e-6 #define LL long long using namespace std; struct Edge{int to;int next;int w; }edge[N*N]; int n,m; int a[N]; int dp[N][N]; int value[N],t[N]; int cnt; void addEdge(int x,int y,int w){cnt++;edge[cnt].to=y;edge[cnt].next=a[x];edge[cnt].w=w;a[x]=cnt; } int treeDP(int x){if (x>n-m){dp[x][1]=value[x];return 1;}int sum=0;for (int i=a[x];i;i=edge[i].next){int v=edge[i].to;int temp=treeDP(v);for(int j=0;j<=sum;j++)t[j]=dp[x][j];for(int j=0;j<=sum;j++)for(int k=0;k<=temp;k++)dp[x][j+k]=max(dp[x][j+k],t[j]+dp[v][k]-edge[i].w);sum+=temp;}return sum; } int main() {cin>>n>>m;memset(dp,~0x3f,sizeof(dp));for(int x=1;x<=n-m;x++){int len;cin>>len;for(int j=1;j<=len;j++){int y,w;cin>>y>>w;addEdge(x,y,w);}}for(int i=n-m+1;i<=n;i++)cin>>value[i];for(int i=1;i<=n;i++)dp[i][0]=0;treeDP(1);for(int i=m;i>0;i--){if(dp[1][i]>=0){printf("%d",i);break;}}return 0; }?
總結
以上是生活随笔為你收集整理的有线电视网(洛谷-P1273)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 烹调方案(洛谷-P1417)
- 下一篇: 骑马修栅栏(信息学奥赛一本通-T1375