C ++ - POJ1988キューブスタッキング[データ構造] [互いに素セット]

int型の検索(INT X){ 戻り?FA [X] == X X:FA [X] =見つける(FA [X]);}

 

#include < セット > 
の#include <マップ> 
の#include <cmath> 
の#include <キュー> 
の#include <ベクトル> 
の#include <cstdioを> 
する#include <cstdlib> 
の#include <CStringの> 
する#include <iostreamの> 
する#include <アルゴリズム>
 使用して 名前空間はstdを、
const  int型 MAXN = 30001 ;
整数 nは、FA [MAXN]、DIS [MAXN]、高さ[MAXN]。チャー S [ 5 ]。
INT検索(INT X){
     int型 FX = FA [X]。 
    もし(FA [X]!= X){
        FA [X] =検索(FA [X]); // パスコンプレッサ 
        DIS [X] = DIS + [FX]; // ラインのみ合成横断は場合
    }
     戻りFA [X]を。
}

ボイド連合(int型のx、int型のY){
     int型 FX =(X)を見つけるFY = (y)を見つけます。
    4 [FY] = FX。
    DIS [FY] = 高さ[FX]。
    高さ[FX] + = 高さ[FY]。
}

INT メイン(){
    scanf関数(" %のD "、&N)
    以下のためにINT iが= 0 ; I <MAXN; I ++)FA [I] = I、高さ[I] = 1 INT ; N - X、Y ); {
        scanf関数(" %S " 、S)。
        もし(S [ 0 ] == ' M ')のscanf(" %D%D "、およびX&Y)、ユニオン(X、Y)
        のscanf(" %dの"、およびX)のprintf(" %D \ n "、高さ[見つける(X)] - DIS [X] - 1 )。
    }
    リターン 0 ;
}

 

おすすめ

転載: www.cnblogs.com/JasonCow/p/12310224.html