牛オフ練習試合56 B・チェンと彼の小さな学校

トピックリンク: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] = - 1TOT = 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 }

 

おすすめ

転載: www.cnblogs.com/SSummerZzz/p/12302027.html