トピックリンク:最大-1082Dをcodeforces直径グラフ
問題の意味
図通信方式の最大直径の構図を作るしようとしているn個の点、最大度の$の$ a_iをのi番目のポイントがあります。
考え
可能であれば、連結グラフは一列に一緒に1度よりも全ての点大きい、構築することができ、残りは左端と右端の点でも可能であり、その後もできやすく、それは貪欲でなければならないかどうかを決定します最適。
実装コード
1つの#include <cstdioを> 2 のconst int型 MAXN = 510 。 3 構造体ノード 4 { 5 int型度、IDX。 6 } NO [MAXN]。 7 構造体のエッジ 8 { 9 int型のU、V。 10 } [MAXN]編。 11 のint NO1 [MAXN]。 12 13 INT メイン(){ 14 INT N。 15 一方(〜のscanf(" %d個"、&N)){ 16 int型 CNT =0、CNT1 = 0、TOT = 0、和= 0 、aiを、 17 のために(int型 i = 1 ; iが<= N; iが++ ){ 18 のscanf(" %dの"、およびAI)。 19 和+ = AI。 20 であれば(AI> 1)NO [CNT ++] = {AI、I}。 21 他の NO1 [CNT1 ++] = I; 22 } 23 であれば(合計<(N - 1)* 2 ){ 24の プット(" NO " ); 25 続け; 26 } 27 INT ANS1 = 0、ANS2 = 0 。 28 のために(int型 I = 0 ; iが、CNT <ない- 1 ; iが++ ){ 29 ED [ANS2 ++] = {NO [I] .IDX、全く[I + 1 ] .IDX}。 30 NO [I] .deg--、全く[I + 1 ] .deg-- ;ていません 31 ANS1 ++ ; 32 } 33 であれば{(CNT1) 34 D [ANS2 ++] = {No1の[cnt1- 1 ]、[IN 0 ]} .IDX。 35 [IN 0 ] .deg-- 。 36 ANS1 ++ ; 37 cnt1-- 。 38 } 39 であれば(-1){ 40 D [ANS2 ++] = {No1の[cnt1- 1 ]に[-1 ]} .IDX。 41 で[CNT- 1 ] .deg-- 。 42 ANS1 ++ ; 43 cnt1-- 。 44 } 45 しばらく(CNT1){ 46 のための(int型 I = 0 ; iがCNTを<; Iは++ ){ 47 であれば(NO [I] .deg){ 48 ED [ANS2 ++] = {NO [I] .IDX、NO1 [cnt1- 1 ] }。 49 なし[i]の.deg-- 。 50 cnt1-- ; 51 } 52 であれば(CNT1 == 0)ブレーク。 53 } 54 } 55 のprintf(" YES%d個の\ n " 、ANS1)。 56 printf(" %d個の\ n " 、ANS2)。 57 のためには、(int型、I = 0 ; I <ANS2; iは++)のprintf(" %D%D \ n " 、ED [I] .U、ED [I] .V)。 58 } 59 リターン 0 。 60 }