リンク:P1195
------------------------------
この質問は確かに一見最小スパニングツリー、最小スパニングツリーで考えるが、最終的には通信ブロックになったことができます。
ねえ、最終的には?私たちは、エッジがプラスではなく、リンクブロックの両端側で、Carusカール・アルゴリズムを考えます。
言い換えれば、我々はすべての操作、通信ブロックを排除することと同等のものを持っています。
このように、我々はそれはできないのkユニコムの最後のブロックを左?
-----------------------------
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <アルゴリズム> 4 使って 名前空間STDを、 5 int型のp; 6 構造体B { 7 int型F; 8 int型へ。 9 int型のV; 10 }扁[ 10500 ]。 11 int型N、M、K。 12 INT FA [ 105000 ]。 13 int型の検索(INT X){ 14 であれば(X == FA [X]) 15 リターンバツ; 16 他 17 リターン FA [X] = (FA [X])を見つけます。 18 } 19 INT上の(int型のx、int型のY){ 20 のint X1 = 見つける(X) 21 INT Y1 = (y)を見つけます。 22 もし(X1 =!Y1) 23 FA [X1] = Y1; 24 } 25 ブールCMP(BA、BC){ 26 リターン AV < CV。 27 } 28 INT X、Y、L。 29の int型のANS; 30 INTメイン(){ 31 CIN >> N >> M >> K。 32 のために(int型 I = 1 ; I <= M; ++ i)が{ 33 のscanf(" %D%D%D "、およびX&Y、&L)。 34 のp ++ ; 35 扁[P] .F = X。 36 扁[P] .TO = Y。 37 扁[P] .V = L。 38 } 39 のための(int型 i = 1 ; iは= N <; ++ I) 40 のFA [I] = I。 41 もしメートル(!=1 ) 42 ソート(扁+ 1、扁+ 1 + M、CMP)。 43 int型 K1 = N- K。 44 のintフラグ= 1 。 45 一方(K1){ 46 INT U = 扁[フラグ] .F。 47 のint V = 扁[フラグ] .TO。 48 もし((見つけるU)=!見つける(V)){ 49 k1-- 。 50の ANS + = 扁[フラグ] .V。 51 オン(U、V)。 52 } 53 フラグ++; 54 } 55 COUT << 年。 56 リターン 0 。 57 }