#586ラウンドCodeforces(DIV。1 +ディビジョン2)E(トポロジカル・ソート、思考)

#include <ビット/ STDC ++ H.>
使用して名前空間STD;
int型N-、M、S、
ベクトル<整数>エッジ[200007];
キュー<整数>葉;
int型の重量[200007]、度[200007];
ロング・ロング・ウェイ[ 200 007]; //現在のポイント合計検索深いダウン重鎖(現在のノードを除く、現在のノードが考慮重量を有する)
INTメイン(){
(偽の)IOSの:: sync_with_stdio;
cin.tie( NULL);
cout.tie(NULL);
CIN >> N-M;
。I <= N;(INT I = 1 Iが++)
CIN >>重量[I];
(INT I = 1; I <= M、Iは++){
int型U、V;
CIN >> U V、
エッジ[U] .push_back(V)、
エッジ[V] .push_back(U);
++度[U];
+度+ [V];
}
CIN >> S;
のための(INT I = 1; Iは<= N-を、Iは++)
(度[I] == 1 && I.をIF!sが葉である場合= S)//、このチェーンリングの重量は、で計算される
leaf.push(I)。
しばらく{(leaf.empty()!)
int型I = leaf.front();
leaf.pop();
度[I] = - 1; //訪問しないようにする
(int型J = 0; jの <エッジ[I ] .size(); J ++){
(度[エッジ[I] [J] <0)//孤立ノードIF
続行;
--degree [エッジ[I] [J]]; //アクセス後解体エッジ
ウェイを[エッジ[I] [J ([I]ウェイウェイ[エッジ[I]、[J]、[I] +重量)]] =マックス; //現在のノードの最大選択チェーンを更新します
IF(度[エッジ[I] [J]] == 1 &&エッジ[I] [J] = S!)
leaf.push(エッジ[I] [J]);
}
}
ロングロングANS = 0; //リング総重量
長い長いMX = 0; //チェーン最大重量
のために(INT I = 1; I <= N - 、Iは++){
IF(度[I]が<0)
続行;
ANS + =体重[I] ;
MX = MAX(MX、ウェイ[I]);
}
COUT << ANS + MX;
戻り0;
}

おすすめ

転載: www.cnblogs.com/ldudxy/p/11573804.html