ZOJ - 4109 - ウェルカムパーティー(+ BFS +互いに素設定プライオリティキュー)

トピックスアドレス  

影響を受ける:N個人、M関係の種類(A及びBが友達である)、n点、m本のエッジは、グラフ理論における問題の知識とみなすことができます

                  少なくとも部屋の並べ替え辞書順最小順に、不幸な出力を人々に尋ねます。(少し前の部屋に彼の友人に余裕がない場合は、彼は幸せではありません)

                  不幸が互いに素セットブロックを使用して、ルートノードと(非友人)のそれぞれ独立した組チェックの数は、全出力の数です。

        そして、BFS図を使用したプライオリティキュートラバーサルは辞書順で、最低保証を堆積しました。答え配列にパス。

コード:

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
const  int型 MAXN = 1E6 + 5 

int型S [MAXN]。
int型VIS [MAXN]。
ベクター < INT >エッジ[MAXN]。  // !二维 
ベクトル< int型 > STO。         // 答案

INT検索(int型T)
{ 
    戻り?T == S [T] T:S [T] = 検索(S [T])。
} 
ボイドマージ(int型 ST、int型編)
{ 
    int型の T1 = (ST)を探します。
    int型の T2 =(編)検索;
    もし(T1 == T2)のリターン;
    もし(T1> T2)スワップ(T1、T2)。
    S [T2] = T1。
} 
ボイド BFS(INTのルート)
{ 
    PRIORITY_QUEUE < int型、ベクトル< INT >、大きな< INT >> Q。  
    しばらく(!Q.pop()Q.empty()); 
    Q.push(ルート)。
    VIS [ルート] = 1 一方、(!Q.empty()){
         int型 T = Q.top()。
        Q.pop(); 
        sto.push_back(T)。
    //     COUT << "サイズ=" << sto.size()<< ENDL。
        以下のためにint型私= 0 ; I <エッジ[T] .size(); iは++ ){
             int型の TEMP = エッジ[T] [I]。
            もし(VIS [TEMP])続けます
            VIS [TEMP] = 1 
            Q.push(TEMP)。
        } 
    } 
} 
int型のmain()
{ 
    int型T、N、M。
    CIN >> T;
    一方、(T-- ){
         int型 ANS = 0 
        CIN >> N >>メートル; 
        sto.clear();       // 回答の空の配列!
        int型 I = 0 {; I <= N-Iは++)     // 0から出発して、ルートノードとすべての友達が存在しないエッジ点[0]は 
            S [I] = I;                     // 互いに素なセットアレイ 
            エッジ[I] .clear();              // 保存辺(二 
            VIS [I] = 0 ;                   // タグアレイ
        }
         ためINT I = 1 I <= M; I ++は){
             int型のX、Y、
            CIN >> >> X Y-。
            エッジ[X] .push_back(Y);        // ので、サイズを決定するために必要とされるマージ互いに対して
            エッジ[Y] .push_back(X)
            ;マージ(X、Y)を
        } 
        ためINT I = 1 ; Iは< N- =; Iは++ ){
             IF(S [I] == I)の{              // すべてのルートノードとエッジが(なし、友人)が存在しません 
                ANS ++を
                エッジ[ 0 ] .push_back(I); 
            } 
        } 
        BFS(0 ); 
        のprintf(" %Dの\のN- " 、ANS);
         INT LEN = sto.size()。
         int型I = 1 ; 私はlen- < 1I ++ ){ 
            COUT << STO [I] << "  " 
        } 
        COUT << STO [len- 1 ] << ENDL。
    } 
    戻り 0 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/JiaaaaKe/p/11294477.html