HDU 1856 More is better

来源:互联网 发布:游戏编程软件 编辑:程序博客网 时间:2024/06/08 09:49

题意

求并查集中最大的一个集合的大小

思路

Union过后,使用Find找到每个节点的祖先统计即可。

传送门

http://acm.hdu.edu.cn/showproblem.php?pid=1856

#include <cstdio>#include <cstring>#include <iostream>using namespace std;class UnionFind {private:    int * fa;    int size;public:     UnionFind(int n) {        size = n;        fa = new int[n+1];        Init();    }    ~UnionFind() {        delete[] fa;    }    void Init() {        for(int i = 1 ; i <= size ; i ++) {            fa[i] = i;        }    }    int Find(int x) {        if(fa[x] != x) {            fa[x] = Find(fa[x]);        }        return fa[x];    }    bool Union(int x,int y) {        int fx = Find(x);        int fy = Find(y);        if(fx != fy) {            fa[fx] = fy;            return true;        }        else {            return false;        }    }    int GetCount() {        int count = 0;        for(int i = 1 ; i <= size ; i ++) {            if(fa[i] == i) {                count ++;            }        }        return count;    }    int GetMaxSetNum() {        int maxSetNum = 0;        int * countSet = new int[size+1];        memset(countSet,0,sizeof(int)*(size+1));        for(int i = 1 ; i <= size ; i ++) {            int fi = Find(i);            countSet[fi] ++;        }        for(int i = 1 ; i <= size ; i ++) {            if(countSet[i] > maxSetNum) {                maxSetNum = countSet[i];            }        }        delete[] countSet;        return maxSetNum;    }};#define MAXN 10000005int main() {    freopen("a.in","r",stdin);    int n;    while(~scanf("%d",&n)) {        UnionFind uf(MAXN);        for(int i = 0 ; i < n ; i++) {            int u,v;            scanf("%d %d",&u,&v);            uf.Union(u,v);        }        printf("%d\n",uf.GetMaxSetNum());    }}
原创粉丝点击