某收費有線電視網計畫轉播一場重要的足球比賽。他們的轉播網和使用者終端構成一棵樹狀結構,這棵樹的根結點位於足球比賽的現場,樹葉為各個使用者終端,其他中轉站為該樹的內部節點。
從轉播站到轉播站以及從轉播站到所有使用者終端的訊號傳輸費用都是已知的,一場轉播的總費用等於傳輸訊號的費用總和。
現在每個使用者都準備了一筆費用想**這場精彩的足球比賽,有線電視網有權決定給哪些使用者提供訊號而不給哪些使用者提供訊號。
寫乙個程式找出乙個方案使得有線電視網在不虧本的情況下使**轉播的使用者盡可能多。
輸入格式:
輸入檔案的第一行包含兩個用空格隔開的整數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輸出樣例#1:2 2 2 5 3
2 3 2 4 3
3 4 2
2樣例解釋
如圖所示,共有五個結點。結點①為根結點,即現場直播站,②為乙個中轉站,③④⑤為使用者端,共m個,編號從n-m+1到n,他們為**比賽分別準備的錢數為3、4、2,從結點①可以傳送訊號到結點②,費用為2,也可以傳送訊號到結點⑤,費用為3(第二行資料所示),從結點②可以傳輸訊號到結點③,費用為2。也可傳輸訊號到結點④,費用為3(第三行資料所示),如果要讓所有使用者(③④⑤)都能看上比賽,則訊號傳輸的總費用為:
2+3+2+3=10,大於使用者願意支付的總費用3+4+2=9,有線電視網就虧本了,而只讓③④兩個使用者看比賽就不虧本了。
裸樹形dp,設f[num][u][j]表示在以u為根,u的兒子節點有num個的子樹中選了j個葉子節點的花費,f[num][u][i]=max,意思是在兒子v中選了j個葉子,在其他兒子中選了i-j個葉子,觀察到f[num][u][i]只與f[num-1][u][i-j]有關,而且i>=i-j,因此可優化為二維,並且i從大到小列舉。
#include #define f(i,l,r) for(i=(l);i<=(r);i++)
#define ff(i,r,l) for(i=(r);i>=(l);i--)
using namespace std;
const int maxn=3005;
int n,m,head[maxn],tot,cost[maxn],f[maxn][maxn];
struct edgee[maxn];
template void read(node &x)
while(isdigit(c))x = x * 10 + c - '0',c = getchar();x *= f;
}inline void add(int u,int v,int w)
inline int dfs(int u)
for(i=head[u];~i;i=e[i].next)
}size+=x;
}return size;
}int main()
f(i,1,n-m)
}f(i,n-m+1,n)
dfs(1);
ff(i,m,1)
}return 0;
}
有線電視網 洛谷 P1273
只能想到n 3的辦法 一看資料量自閉了。看了題解也是n 3 智障出題人 dp i j 代表以i為根的子樹選j個使用者時得到的最大收益 然後就是樹上揹包轉移一下 最後看根節點上最多選幾個人不虧本 include include include using namespace std const int...
有線電視網 洛谷P1273
題目描述 某收費有線電視網計畫轉播一場重要的足球比賽。他們的轉播網和使用者終端構成一棵樹狀結構,這棵樹的根結點位於足球比賽的現場,樹葉為各個使用者終端,其他中轉站為該樹的內部節點。從轉播站到轉播站以及從轉播站到所有使用者終端的訊號傳輸費用都是已知的,一場轉播的總費用等於傳輸訊號的費用總和。現在每個使...
P1273 有線電視網(洛谷)
這道題我一開始也是不會,後來看了題解,是分組揹包dp問題,然後明白了,下面就說一說思路 題意自己看吧 用d i,j,k 表示以j作為根節點的子樹,在前i個子節點中選擇k個節點所得到的最大收益,顯然這樣的定義是將問題轉化了,滿足d i,j,k 0最後就能夠考慮 j 1,也就是說是最初的大根 然而其他情...