UVA-10608フレンズ[互いに素なセット]

N市民との町があります。人々のいくつかのペアが友達であることが知られています。よると
、AとBが友達である場合、以下のことを「あまりにも、私の友人の友人は私の友達である」という有名
とBとCが友達であるその後、AとCは、あまりにも、友達です。
あなたの仕事は、友人の最大のグループでありますどのように多くの人々数えることです。


入力
入力は、複数のデータセットからなります。入力の最初の行は試験の数の行で構成され
従うケース。
各データセットの最初の行は、Nは、町の数である数NとM、カントー含ま
市民(30000≤1≤N)とMが知られている人(500000≤0≤M)の組の数である
ことが友人。次のM行の各々は二つの整数AとB(1≤A≤N、1≤B≤N、から構成
A及びBが友達であることを説明!= B)。与えられたペアの間で繰り返しがあるかもしれません。


出力
各テストケースの出力は(単独行で)含まれている必要がありますどのように多くの人々表す1数
単独行上の友人の最大のグループであります。


サンプル入力
2
3 2
1 2
2 3
10 12
1 2
3 1
3 4
5 4
3 5
4 6
5 2
2 1
7 1
1 2
9 10
8 9


サンプル出力
3
7

 

注:Mがゼロであるデータ範囲を。

 

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、

const  int型 MAXN = 10001 ;
int型N、M。
int型ANS;
int型のp [MAXN]。
int型のCNT [MAXN]。

INT ffind(INT X)
{ 
    戻り P [X] == X?X:P [X] = ffind(P [X])。
} 

ボイドのinit(int型N)
{ 
    ANS = 1 int型 iは= 1 ; iが<= N iが++ 
        P [i]は = I、CNT [I] = 1; 

} 

ボイド uunion(INT U、INT V)
{ 
    int型 A = ffind(U)。
    INT B = ffind(V)。
    もし(!= b)は、
        P [B] = CNT [A] + = CNT [B]。
    ANS = MAX(CNT [A]、ANS)。
} 


int型のmain()
{ 
#ifndefのONLINE_JUDGE 
    freopenは(" in.ini "" R " 、STDIN)。
#endifの // ONLINE_JUDGE 
    int型T; 
    CIN >>T;
    一方、(T-- 
    { 
        CIN >> N >> M。
        INIT(N)。
        int型、B;
        int型 iは= 0 ; I Mを<Iは++ 
        { 
            CIN >> A >> B。
            uunion(B)
        } 

        COUT << ANS << ENDL。
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/YY666/p/11222182.html