Codeforcesラウンド#600(本部2) - D.調和グラフ(互いに素セット)

問題の意味:マップについて、および$ A $ $ $通信B場合、任意の$ C(<C <B)$ A $および$通信C $ $を有する、図調和のグラフと呼ばれます今、あなたのマップを与え、グラフは、調和のとれた図となってエッジの最小数を追加するかどうかを尋ねて。

アイデア:rootとして通信ブロック内の最大のポイント、再びトラバース互いに素セットメンテナンス、ポイントのルートFX $ $ $とポイントI $の通信ブロックと、FX以内に$ $ $ I $をします$ I $はセット、マージ、プラスの答えに属し、通信ブロックのルートを更新しない各点、。

書式#include <iostreamの> 
の#include <アルゴリズム> 
書式#include <cstdioを>

使用して 名前空間はstdを、

const  int型 N = 200010 ;

INT [N] N、M前;

のinit()
{
    以下のためにINT iが= 1 ; I <= N; I ++)FA [I] = I。
}

int型の検索(int型x)は、
{
    リターンのx == 4 [x]は?X:4 [X] = 見つける(4 [X])。
}

ボイド nuio(int型のx、int型のY)
{
    INT FX =(X)を見つけるFY = (y)を見つけます。
    もし(!FX = FY){
         場合(FX>年度)FA [FY] = FX。
        他の FA [FX] = FY;
    }
}

int型のmain()
{
    scanf関数(" %D%D "、&​​N、&M)。
    その中に();
    以下のためにINT iが= 1 ; I <= M; I ++ ){
         int型のX、Y。
        scanf関数(" %D%D "、およびX&Y)。
        nuio(X、Y)
    }
    int型のres = 0 ;
    以下のためにINT iが= 1 ; I <= N; I ++ ){
         int型の FX =を見つける(I)。
        一方、(I < FX){
             int型 FY = 見つける(I)。
            もし(FX!= 年度){
                解像度 ++ ;
                もし(FX>年度)FA [FY] = FX。
                他の FA [FX] = FY;
                FX = MAX(FX、FY)。
            }
            I ++ ;
        }
    }
    printf(" %dの\ n " 、RES)。
    リターン 0 ;
}

おすすめ

転載: www.cnblogs.com/zzzzzzy/p/12034496.html