コード:
#include <cstdioを> する#include <アルゴリズム> の#define N 50020 の#defineっ長い長 の#define setIO(複数可)(S ".IN"、 "R"、STDIN)freopenは 名前空間stdを使用します。 構造体データ { int型のX、Y、Z。 データ(INT A = 0、INT B = 0、INT C = 0){X = Y = B、Z = C;} ブール演算子<(CONSTデータA)のconst {戻りZ <AZ。} } B [N << 1]、W [N << 1]。 INT TB、TW、N、F [N]、合計。 INT検索(INT X) { 戻りF [X] == X X:F [X] =検索(F [X])? } 解決INT(INTのMID) { int型I、PB = 1、PW = 1、ANS = 0。 合計= 0; ための式(I = 0; iが<N; ++ I)F [I] = I。 (PB <= TB || PW <しばらく (PW> TW ||(PB <= TB && B [PB] .Z <W [PW] .Z + MID))なら 、{ もし(見つける(B [PB] .X)!=を見つける(B [PB] .Y )) { 合計+ = B [PB] .Z。 F [F [B [PB] .X] = F [B [PB] .Y]。 } ++ PB。 } 他 { (!)(W [PW] .X)=を見つける(W [PW] .Yを見つける。)であれば { 和+ = W [PW] .Z。 F [F [W [PW] .X] = F [W [PW] .Y]。 ++ ANS; } ++ PW。 } } ANSを返します。 } メインINT() { // setIO( "入力"); INT I、J、M、K、X、Y、Z、P、L = -100、R = 100、中間、ANS。 scanf関数( "%D%D%D"、&N、&M、およびK); (; I <= M ++ iは= 1)のための { scanf関数( "%D%D%D%D"、およびX&Y、およびZ、&P)。 もし(P)B [++ TB] =データ(X、Y、Z)。 他W [++ TW] =データ(X、Y、Z)。 } ソート(B + 1、B + 1 + TB)。 ソート(1 + W W + 1 + TW)。 (L <= r)は、一方 { 1半ば=(L + R)>>。 IF(解く(MID)> = K)ANS =中間、L =ミッド+ 1。 他に、R =半ば1; } (ANS)を解きます。 printf( "%dの\ n"は、合計)。 0を返します。 }