P4438 [HNOI/AHOI2018]道路


題目描述

W 國的交通呈一棵樹的形狀。W 國一共有n - 1n1個城市和nn個鄉村,其中城市從11到n - 1n1 編號,鄉村從11到nn編號,且11號城市是首都。道路都是單向的,本題中我們只考慮從鄉村通往首都的道路網絡。對於每一個城市,恰有一條公路和一條鐵路通向這座城市。對於城市i, 通向該城市的道路(公路或鐵路)的起點,要么是一個鄉村,要么是一個編號比ii大的城市。 沒有道路通向任何鄉村。除了首都以外,從任何城市或鄉村出發只有一條道路;首都沒有往 外的道路。從任何鄉村出發,沿着唯一往外的道路走,總可以到達首都。

W 國的國王小 W 獲得了一筆資金,他決定用這筆資金來改善交通。由於資金有限,小 W 只能翻修n - 1n1條道路。小 W 決定對每個城市翻修恰好一條通向它的道路,即從公路和鐵 路中選擇一條並進行翻修。小 W 希望從鄉村通向城市可以盡可能地便利,於是根據人口調 查的數據,小 W 對每個鄉村制定了三個參數,編號為ii的鄉村的三個參數是a_iaib_ibic_ici。假設 從編號為ii的鄉村走到首都一共需要經過xx條未翻修的公路與yy條未翻修的鐵路,那么該鄉村 的不便利值為

c_i \cdot (a_i + x) \cdot (b_i + y)ci(ai+x)(bi+y)

在給定的翻修方案下,每個鄉村的不便利值相加的和為該翻修方案的不便利值。 翻修n - 1n1條道路有很多方案,其中不便利值最小的方案稱為最優翻修方案,小 W 自然 希望找到最優翻修方案,請你幫助他求出這個最優翻修方案的不便利值。

輸入格式

第一行為正整數nn。

接下來n - 1n1行,每行描述一個城市。其中第ii行包含兩個數s_i,t_isi,tis_isi表示通向第ii座城市 的公路的起點,t_iti表示通向第i座城市的鐵路的起點。如果s_i > 0si>0,那么存在一條從第s_isi座城 市通往第ii座城市的公路,否則存在一條從第-s_isi個鄉村通往第i座城市的公路;t_iti類似地,如 果t_i > 0ti>0,那么存在一條從第t_iti座城市通往第i座城市的鐵路,否則存在一條從第-t_iti個鄉村通 往第ii座城市的鐵路。

接下來nn行,每行描述一個鄉村。其中第i行包含三個數a_i,b_i,c_iai,bi,ci,其意義如題面所示。

輸出格式

輸出一行一個整數,表示最優翻修方案的不便利值。

輸入輸出樣例

輸入 #1
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
輸出 #1
54
輸入 #2
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
輸出 #2
548
輸入 #3
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
輸出 #3
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 44的數據,n \le 20n20;
對於編號為5 ∼ 8的數據,a_i,b_i,c_i \le 5ai,bi,ci5,n \le 50n50;
對於編號為9 ∼ 12的數據,n \le 2000n2000;
對於所有的數據,n \le 20000n20000,1 \le a_i,b_i \le 601ai,bi60,1 \le c_i \le 10^91ci109,s_i,t_isi,ti[-n,-1] \cup (i,n - 1][n,1](i,n1]內的整數,任意鄉村可以通過不超過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;
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM