説明
明明は最近部門が安全なチャネル接続の問題を確立する方法であること、小型の諜報機関に入りました。
インテリジェンス部門は、n個の整数の1とn個のステーションを持っています。Mは知性ステーションUIを与えられ、viとコストのwi、状況を表し
ユニットは、UIとVIの間でのWi-ストップチャネルを構築するためのリソースを費やすことができます。
チャンネル数による知能ステーションが他のステーションに到達することができ、良好な知性を確立する場合、2つのインテリジェンスの駅
チャネル接続を確立します。UIおよびVIである場合、UIおよびVI確立されたチャネル場合正式に、それらはトンネル接続を確立し
そして、Tiは、チャネル接続、UIとも確立VIチャネル接続を確立しました。
これで、すべてのインテリジェンスの駅、P重要な諜報局があり、各ステーションは、特定のチャンネルの知性を持っています。小Mingming
すべての任意の諜報局との間で同じチャンネルにトンネリングするように、最小限のリソースを要する問題。
入力
、P情報局の数、チャネルの数を確立することができ、重要な情報局の数を表し、m;最初の行は三つの整数Nを含んでいます
金額。VI; WI、チャネルを確立することができる表し続い三つの整数UIを含む各行は、行をMです。最後に、p行は、各行に含む、あります
二つの整数CI;ジ、それが情報チャネルとステーションインテリジェンスステーションのかなりの数を表します。
出力
ライン出力整数総最小リソースはチャネル接続は、任意のステーションの間で同一のチャネル情報を取得確立され表します。
サンプル入力
5 8 4
1 2 3
1 2 3
1 5 1
2 4 2
2 5 1
3 4 3
3 5 1
4 5 1
1 1
1 2
2 3
2 4
1 2 3
1 2 3
1 5 1
2 4 2
2 5 1
3 4 3
3 5 1
4 5 1
1 1
1 2
2 3
2 4
サンプル出力
4
ヒント
選択(1; 5);(3; 5);(2; 5)(4; 5)が接続されているステーション4知性。
0 <UI; VI、データ、0 <CI <= p <= 10の100%のジ<= N <= 1000; 0 <= M <= 3000; 0 <=のWi <=
20000。
最小スタイナー木。
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 int型 CONST N = 1000年 + 10 。 4 INT CONST INF = 1E9。 5 int型 CONST M = 1024 + 10 。 6 構造体の縁{ 7 INT に、NT、W。 8 } E [N << 4 ]。 9 INT VIS [N]、H [N]、CNT、N、M、P、[N] [M]、[F 11 ]、B [ 11 ]、ST [ 11 ]、ID [ 11]、G [M]。 10キュー< 整数 > Q; 11 ボイド(追加をint、int型 B、INT {C) 12 E [++ CNT] .TO = B。 13 E [CNT] .W = C。 14 E [CNT] .nt =さH [A]。 15 H [A] = CNT。 16 } 17 INT メイン(){ 18 のscanf(" %D%D%D "、&N、&M、&P); 19 一方(M-- ){ 20 、INT X、Y、Z。 21 のscanf(" %D%D%D "、およびX&Y、およびZ)。 22 追加(X、Y、Z)。 23 追加(X、Y、Z)。 24 } 25 のための(int型 i = 1 ; iがn = <I ++ ) 26 のための(INT J = 0 ; J <(1つの)<< P; J ++ ) 27の F [I] [J] = INF。 28 のためには、(int型 I = 1 ; I <= P、iは++ ){ 29 のscanf(" %d個の%のD "、および[I]、&B [I])。 30 F [B [I]] [ 1 <<(I- 1)] = 0 ; 31 番目の[I] + =(1 << I- 1 )。 32 ID [[I] =のB [i]は、 33 } 34 のために(int型のk = 1 ; K <(1 << P); kは++ ){ 35 のために(int型 i = 1 ; iがn = <; iは++ ){ 36 のために(INT X = K・(K- 1) ; X; X =(X- 1)・K){ 37 のint TMP = F [i]が[X] + F [i]が[K-バツ]; 38 F [i]が[K] = 分(F [i]が[K]、TMP)。 39 } 40 であれば(F [i]が[K] < INF){ 41 q.push(I)。VIS [I] = 1 。 42 } 43 } 44 ながら(!q.empty()){ 45 、INT X = q.front()。 46 q.pop()。 47 VIS [X] = 0 。 48 のために(int型 [X] I = hを、I; I = E [I] .nt){ 49 のint V = E [I] .TO。 50 もし(F [V] F [X] [K] + [K]> E [I] .W){ 51 F [v] [K] = F [X] [K] + E [I] .W。 52 であれば(!VIS [V]){ 53 q.push(V)。 54 VIS [V] = 1 。 55 } 56 } 57 } 58 } 59 } 60 のために(INT K = 1 ; K <(1 << P); kは++ ){ 61 INT S = 0、T = 0 。 62 のための(int型 I =0 ; iは、P <; iは++ ) 63 であれば(K&(1 << I)){ 64の S + = ST [I + 1 ]。 65 であれば(T!の)T = ID [I + 1 ]。 66 } 67 G [K] = F [T] [S]。 68 のために(INT X = K・(K- 1); X、X =(X- 1)・K) 69 G [K] =分(G [K]、G [X] + G [K- X]) ; 70 } 71 COUT << G [(1 << P) - 1 ] << ENDL。 72 リターン 0 ; 73 }