リンク
https://vjudge.net/problem/UVA-1395
コード
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #defineは ULL符号なし長い長 の#defineっ長い長 のconst int型 MAXN = 5E4 + 10 。 int型のパー[MAXN]。 INT ランク-1 [MAXN]。 無効(INITをint型 N)// 初始化 { ため(int型 I = 0 ; iが<= N; iが++ ) { パー[I] = I。 ランク-1 [I] = 0 ; } } int型の検索(INT X) { X。もし(パー[X] == X) { 戻りX。 } 他 { 戻り [X] = PAR (PARは、[X])を見つけます。 } } ボイド(団結int型のx、int型のy)を { X =こと見つける(X)。 Y = 検索(Y)。 もし(x == y)の リターン; 場合(ランク-1は[X] < ランク-1 [Y]) { パー[X] = yと、 } 他 { パー[Y] = } もし(ランク-1 [X] == ランク-1 [Y]) ランク-1 [X] ++ ; } int型、N Mと、 構造体のエッジ{ int型のX、Y、コスト。 } E [ 50005 ]。 BOOL CMP(CONSTエッジE1、CONST エッジE2) { 戻り e1.cost < e2.cost。 } int型のmain() { 一方(CIN >> N >> M &&(N || M)) { ため(int型 I = 1 ; I <= M; I ++ ) { CIN >> E [I] .X >> E [i]は.Y >>E [i]の.cost。 } INT RES = - 1 。 ソート(E + 1、E + M + 1 、CMP)。 以下のために(int型 I = 1 ; I <= M; iは++ ) { INIT(N) int型 NUM = 0 ; 用(int型 ; J <= M J ++ J = I ) { エッジE1 = E [J]。 int型のx = のfind(e1.x)。 INT Y = (e1.y)を見つけます。 もし X(!=Y) { NUM ++ 。 ユナイト(e1.x、e1.y)。 もし(NUM == N- 1 ) { 場合(RES == - 1 ) RES = E [J] .cost- E [I] .cost。 他 RES =分(RES、E [J] .cost- E [I] .cost)。 } } // coutの<< I << " "<< NUM <<" \ nを"; } } coutの << RES << " \ nを" 0 。 }