トピックリンク:https://ac.nowcoder.com/acm/contest/3566/B
アイデア:道路が図の左右の部分に分割することができます。
l_ci、l_peo、r_ci、r_peoは、それぞれwは、街や人の数、右の数と都市の数、道路のコストを残しました。
私たちは、l_ci都市に行く人々の権利は左、人は右に左r_ci都市に行くことを知っています
(なお、前後)、パスのコストは* W = 2 *(l_ci * r_peo + r_ci * l_peo)コストです。
私たちは、市内各地のエッジと例数を導出するトポロジカルソートを使用することができます。
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <アルゴリズム> 4の#include <キュー> 5 使用して 名前空間をSTD。 6のtypedef 長い 長LL。 7 8 CONST 整数 N =(INT)2E5 + 100 。 9 構造体ノード{ 10 INT 、NXTに、 11 } E [N << 1 ]。 12 構造体情報{ 13 のint CI、PEO。 14 INFO(){CI = PEO = 0;} 15 }インフォ[N]; 16 int型 A [N]、Wは、[N]は、[N]をデュ、ヘッド[N]; // 番号、市外、度 17 BOOL VIS [N]; 18である INT N-、U 、V、W、TOT、LLのsum_peo; 19 20は、インライン無効追加(INT U、INT V)を、{ 21であり 、Eは[TOT] .TO = V; E [TOT] .nxtヘッド= [U];頭部[U] = ++ TOT ; 22である E [TOT = .nxtヘッド[V];頭部[V] TOT = ++ E [TOT] .TO = U ; 23である } 24 25 ボイドtop_sort(){ 26が // 内圧力の度合い 27 キュー< 整数 >QUE; 28 用(INT I = 1 ; I <= N; ++ I){ 29 IF(DU [I] == 1 ){ 30 VIS [I] = 1 ; 31である que.push(I); 32 } 33は } 34である 35 ながら(!{que.empty()) 36 INT今= que.front(); que.pop(); 37 // 場合、それらの都市を追加し 38である インフォ[今] + = .ci 1。; 39 インフォ[今] + = .peo A [今]; 40 用(のInt O =頭部[今];〜O、O = E [O] .nxt){ 41が INT =にE [O] .TO; 42で IF(!{VIS [する]) 43である //はその都市を通過ケース 44は、 + = .ci【へ】情報[今] .ci情報; 45 + = .peo【へ】情報[今] .peo情報、 46は IF(--du [する] == 1 ){ 47 VIS [ =]に1。; 48 (へ)que.push; 49 } 50 } 51である } 52です } 53 } 54 55 空隙show_info(){ 56 のために(INT iは= 1 ; iが<= N; ++ I){ 57 のprintf(" 今=%d個の都市=%d個の人々 =%D \ n " 、I、インフォ[i]は.ci、情報[i]の.peo)。 58 } 59 } 60 61インラインLLコスト(情報&U、int型のI){ 62 情報V。 63 v.ci = N- u.ci。 64 v.peo = sum_peo - u.peo。 65 // printf( "UC =%D VC =%D =最大%D、VP =%D W =%D \ n"は、u.ci、v.ci、u.peo、v.peo、W [I])。 66 リターン(LL)2 * W [i]は*((LL)u.ci * v.peo +(LL)v.ci * u.peo)。 67 } 68 69 、INT (){主 70 71 のscanf(" %d個"、&N) 72 のために(INT iは= 0 ; iが<= N; ++ I)ヘッド[I] = - 1。TOT = 0 ; 73 のために(INT iは= 1 ; I <= N ++ {I) 74 のscanf(" %dの"A + I); 75 sum_peo + = A [I]; 76 } 77 のために(INTは iは= 1 ; I <N; ++ i)が{ 78 のscanf(" %D%D%D "、&U&V、 + W I); 79 追加(U、V); 80 ++デュ[U]; ++デュ[V]; // 无向边 81 } 82 top_sort(); 83 // show_info(); 84 用(INT私は= 0 ; I < 2 *(N- 1)、I + =2 ){ 85 // 我々は常に脇描か都市のエッジの数が少ないと街の反対側から、選択された数 86 INT X =インフォ[E [I] .TO] .ci <インフォ[E [I ^ 1?] .TO] .ci E [I] .TO:E [I ^ 1。] .TO; 87 // のprintf( "市D =%\ N-"、X); 88 のprintf(" %LLD \ N- "、コスト(情報[X]、1 +(I >> 1 ))); 89 } 90 91であり 、リターン 0 ; 92 }