HDU 1213 How Many Tables 并查集

来源:互联网 发布:工作站知乎 编辑:程序博客网 时间:2024/06/07 23:45

题意

n个点,m条边,无向图,求最后形成的集合有多少个。

解法

基础的并查集

传送门

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

Code

#include <cstdio>#include <iostream>using namespace std;class UnionFind {private:    int * fa;    int size;public:     UnionFind(int n) {        size = n;        fa = new int[n+1];        for(int i = 1 ; i <= size ; i ++) {            fa[i] = i;        }    }    ~UnionFind() {        delete[] fa;    }    int Find(int x) {        if(fa[x] != x) {            fa[x] = Find(fa[x]);        }        return fa[x];    }    void Union(int x,int y) {        int fx = Find(x);        int fy = Find(y);        if(fx != fy) {            fa[fx] = fy;        }    }    int GetCount() {        int count = 0;        for(int i = 1 ; i <= size ; i ++) {            if(fa[i] == i) {                count ++;            }        }        return count;    }};int main() {    int caseNum;    scanf("%d",&caseNum);    while(caseNum--) {        int n , m ;        scanf("%d %d",&n,&m);        UnionFind uf(n);        for(int i = 1 ; i <= m ; i ++) {            int u , v;            scanf("%d %d",&u,&v);            uf.Union(u,v);        }        int ans = uf.GetCount();        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击