題目描述
W 國的交通呈一棵樹的形狀。W 國一共有n - 1n−1個城市和nn個鄉村,其中城市從11到n - 1n−1 編號,鄉村從11到nn編號,且11號城市是首都。道路都是單向的,本題中我們只考慮從鄉村通往首都的道路網絡。對於每一個城市,恰有一條公路和一條鐵路通向這座城市。對於城市i, 通向該城市的道路(公路或鐵路)的起點,要么是一個鄉村,要么是一個編號比ii大的城市。 沒有道路通向任何鄉村。除了首都以外,從任何城市或鄉村出發只有一條道路;首都沒有往 外的道路。從任何鄉村出發,沿着唯一往外的道路走,總可以到達首都。
W 國的國王小 W 獲得了一筆資金,他決定用這筆資金來改善交通。由於資金有限,小 W 只能翻修n - 1n−1條道路。小 W 決定對每個城市翻修恰好一條通向它的道路,即從公路和鐵 路中選擇一條並進行翻修。小 W 希望從鄉村通向城市可以盡可能地便利,於是根據人口調 查的數據,小 W 對每個鄉村制定了三個參數,編號為ii的鄉村的三個參數是a_iai,b_ibi和c_ici。假設 從編號為ii的鄉村走到首都一共需要經過xx條未翻修的公路與yy條未翻修的鐵路,那么該鄉村 的不便利值為
c_i \cdot (a_i + x) \cdot (b_i + y)ci⋅(ai+x)⋅(bi+y)
在給定的翻修方案下,每個鄉村的不便利值相加的和為該翻修方案的不便利值。 翻修n - 1n−1條道路有很多方案,其中不便利值最小的方案稱為最優翻修方案,小 W 自然 希望找到最優翻修方案,請你幫助他求出這個最優翻修方案的不便利值。
輸入格式
第一行為正整數nn。
接下來n - 1n−1行,每行描述一個城市。其中第ii行包含兩個數s_i,t_isi,ti。s_isi表示通向第ii座城市 的公路的起點,t_iti表示通向第i座城市的鐵路的起點。如果s_i > 0si>0,那么存在一條從第s_isi座城 市通往第ii座城市的公路,否則存在一條從第-s_i−si個鄉村通往第i座城市的公路;t_iti類似地,如 果t_i > 0ti>0,那么存在一條從第t_iti座城市通往第i座城市的鐵路,否則存在一條從第-t_i−ti個鄉村通 往第ii座城市的鐵路。
接下來nn行,每行描述一個鄉村。其中第i行包含三個數a_i,b_i,c_iai,bi,ci,其意義如題面所示。
輸出格式
輸出一行一個整數,表示最優翻修方案的不便利值。
輸入輸出樣例
6 2 3 4 5 -1 -2 -3 -4 -5 -6 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
54
9 2 -2 3 -3 4 -4 5 -5 6 -6 7 -7 8 -8 -1 -9 1 60 1 1 60 1 1 60 1 1 60 1 1 60 1 1 60 1 1 60 1 1 60 1 1 60 1
548
12 2 4 5 3 -7 10 11 9 -1 6 8 7 -6 -10 -9 -4 -12 -5 -2 -3 -8 -11 53 26 491 24 58 190 17 37 356 15 51 997 30 19 398 3 45 27 52 55 838 16 18 931 58 24 212 43 25 198 54 15 172 34 5 524
5744902
說明/提示
【樣例解釋 1】
如圖所示,我們分別用藍色、黃色節點表示城市、鄉村;用綠色、紅色箭頭分別表示 公路、鐵路;用加粗箭頭表示翻修的道路。
一種不便利值等於54的方法是:翻修通往城市2和城市5的鐵路,以及通往其他城市的 公路。用→和⇒表示公路和鐵路,用∗→和∗⇒表示翻修的公路和鐵路,那么:
編號為1的鄉村到達首都的路線為:-1 ∗→ 3 ⇒ 1,經過0條未翻修公路和1條未翻修鐵 路,代價為3 × (1 + 0) × (2 + 1) = 9;
編號為2的鄉村到達首都的路線為:-2 ⇒ 3 ⇒ 1,經過0條未翻修公路和2條未翻修鐵 路,代價為2 × (1 + 0) × (3 + 2) = 10;
編號為3的鄉村到達首都的路線為:-3 ∗→ 4 → 2 ∗→ 1,經過1條未翻修公路和0條未 翻修鐵路,代價為3 × (2 + 1) × (1 + 0) = 9;
編號為4的鄉村到達首都的路線為:-4 ⇒ 4 → 2 ∗→ 1,經過1條未翻修公路和1條未翻 修鐵路,代價為1 × (2 + 1) × (3 + 1) = 12;
編號為5的鄉村到達首都的路線為:-5 → 5 ∗⇒ 2 ∗→ 1,經過1條未翻修公路和0條未 翻修鐵路,代價為2 × (3 + 1) × (1 + 0) = 8;
編號為6的鄉村到達首都的路線為:-6 ∗⇒ 5 ∗⇒ 2 ∗→ 1,經過0條未翻修公路和0條未翻修鐵路,代價為1 × (3 + 0) × (2 + 0) = 6;
總的不便利值為9 + 10 + 9 + 12 + 8 + 6 = 54。可以證明這是本數據的最優解。
【樣例解釋 2】
在這個樣例中,顯然應該翻修所有公路。
【數據范圍】 一共20組數據,編號為1 ∼ 20。 對於編號\le 4≤4的數據,n \le 20n≤20;
對於編號為5 ∼ 8的數據,a_i,b_i,c_i \le 5ai,bi,ci≤5,n \le 50n≤50;
對於編號為9 ∼ 12的數據,n \le 2000n≤2000;
對於所有的數據,n \le 20000n≤20000,1 \le a_i,b_i \le 601≤ai,bi≤60,1 \le c_i \le 10^91≤ci≤109,s_i,t_isi,ti是[-n,-1] \cup (i,n - 1][−n,−1]∪(i,n−1]內的整數,任意鄉村可以通過不超過40條道路到達首都。
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<queue> using namespace std; typedef long long int ll; ll chkmin(ll x,ll y){return x<y?x:y;} ll chkmax(ll x,ll y){return x<y?y:x;} ll dp[400][50][50],c[20010]; int n,a[20010],b[20010]; int lson[20010],rson[20010]; void dfs(int r,int x,int u,int v){ if(x>0){ dfs(r+2,lson[x],u+1,v); dfs(r+2+1,rson[x],u,v+1); for(int i=0;i<=u;i++){ for(int j=0;j<=v;j++){ dp[r][i][j]=chkmin(dp[r+2+1][i][j]+dp[r+2][i+1][j],dp[r+2+1][i][j+1]+dp[r+2][i][j]); } } } else{ for(int i=0;i<=u;i++){ for(int j=0;j<=v;j++){ dp[r][i][j]=c[-x]*(a[-x]+i)*(b[-x]+j); } } } } int main(){ scanf("%d",&n); for(int i=1;i<n;i++){ scanf("%d%d",&lson[i],&rson[i]); } for(int i=1;i<=n;i++){ scanf("%d%d%lld",&a[i],&b[i],&c[i]); } dfs(1,1,0,0); printf("%lld\n",dp[1][0][0]); return 0; }