UVA1395(最も細い最小スパニングツリー)

リンク

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 
}

 

おすすめ

転載: www.cnblogs.com/hh13579/p/11666953.html