問題のluogu_1550溶液] [ドリル(最小スパニングツリー)

トピック:https://www.luogu.org/problemnew/show/P1550

N + 1個の点の集合は、水の点です。

被験者は、n + 1を見つける最小全域木となります。

WNへW1は、nとn + 1つの側に1に接続されています。

マトリックスの背後にそれぞれの側に接続されています。

コードは以下の通りであります:

#include <ビット/ STDC ++ H>
 の#define SC(X)のscanf( "%d個"、&x)を
 使用して、 名前空間STDを、
int型 N、ANS、CNT = 1 構造体のエッジ{
     INT  から、DIS、であり;
    ブール 演算子 <(constのエッジ&A)のconst {
         戻り DIS> a.disと、
    } 
} E [ 400 << 1 ]。
PRIORITY_QUEUE <エッジ> Q。
INT FA [ 400 ]、ヘッド[ 400 ]。
インラインint型のfind(int型X){
     場合(FA [X] == x)を返すFAを[X]。
     戻り FAは[X] = 見つける(FA [X])。
} 
int型のmain()
{ 
    SC(N)。
    以下のためにint型 i = 1 ; iが<= N; iは++ ){
         int型、W; SC(W)。
        q.push((エッジ){I、N + 1 、W})。
        q.push((エッジ){N + 1 、I、W})。
    } 
    のためにint型 i = 1 ; iがn = <; I ++ のためのINT J = 1 ; J <= N; J ++ 
        { 
            INT W; SC(W)。
            q.push((エッジ){I、J、W})。
        } 
    のためのint型 i = 1 ; iが<= N + 1 ; iが++)FA [I] = I。
    一方(CNT <N + 1 ){ 
        エッジe = q.top()。
        q.pop(); 
        もし((E見つける。から)==検索(e.to))続けます{ 
            FA [(E。見つけるから)] = (e.to)を見つけます。
            CNT ++ ; 
            ANS + = (e.dis)。
        } 
    }
    coutの << ANS << てendl; 
    システム(一時停止)。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/ChrisKKK/p/10960386.html