2011-06-10 19:40:16Morris

d831. 畢業旅行

http://zerojudge.tw/ShowProblem?problemid=d831

內容 :

多年來友情的羈絆,終於將在這畢業的季節開花結果。

這幾天,班上同學們無時無刻都熱烈討論著畢業旅行的地點。
小明說,如果要去六福村,可以順便去小人國;
小美說,如果去了恆春的話,墾丁就在幾十公里外了,一定也要去玩;
小華表示,小鬼湖跟大鬼湖好像很近,似乎都是很有趣的地方。

身為班長,聽到同學這麼多「去了哪裡也可以去哪裡」的資訊後,
你決定要為班上的同學們,找到一個能玩最多景點的畢業旅行。

輸入說明 :

有多組測試資料,以 EOF 結束。

每組測試資料的第一行有兩個正整數 n (n<=1000000) 和 m (m<=100000),
表示景點有 n 個,編號為 0 ~ n-1。
接下來有 m 行,每行有兩個整數 a 和 b (0<=a,b<n),

表示去了 a 的同時也可以去 b(反過來也一樣)。 

輸出說明 :

輸出一個數字,表示畢業旅行最多可以玩的景點數量。

範例輸入 :

6 4
0 1
2 3
1 3
5 4
1000000 0
1000000 1
0 999999

範例輸出 :

4
1
2

提示 :

出處 :

(管理:shik)

作法 : 并查集

/**********************************************************************************/
/*  Problem: d831 "畢業旅行" from                                             */
/*  Language: C                                                                   */
/*  Result: AC (20ms, 3389KB) on ZeroJudge                                        */
/*  Author: morris1028 at 2011-06-04 19:46:34                                     */
/**********************************************************************************/


#include<stdio.h>
int Parent[1000001], Rank[1000001];
int a;
void MakeSet(int N) {
    for(a = 0; a <= N; a++)
        Parent[a] = a, Rank[a] = 1;
}
int FindSet(int x) {
    if(x != Parent[x])
        Parent[x] = FindSet(Parent[x]);
    return Parent[x];
}
void Link(int x, int y) {
    if(Rank[x] > Rank[y])
        Parent[y] = x, Rank[x] += Rank[y];
    else
        Parent[x] = y, Rank[y] += Rank[x];
}
void Union(int x, int y) {
    x = FindSet(x), y = FindSet(y);
    if(x != y)
        Link(x, y);
}
int Input() {  
    char cha;  
    unsigned int x = 0;  
    while(cha = getchar())  
        if(cha != ' ' && cha != '\n' || cha == EOF) break;  
    if(cha == EOF) return -1;
    x = cha-48;  
    while(cha = getchar()) {  
        if(cha == ' ' || cha == '\n') break;  
        x = x*10 + cha-48;  
    }  
    return x;  
}    
main() {
    int N, M, x, y, a;
    while(scanf("%d %d", &N, &M) == 2) {
        MakeSet (N);
        for(a = 0; a < M; a++)
            x = Input(), y = Input(), Union(x, y);
        int max = 0;
        for(a = 0; a < N; a++)
            if(Rank[a] > max) max = Rank[a];
        printf("%d\n", max);
    }
    return 0;
}

上一篇:d806. 水火不容

下一篇:d832. 遊樂場