HDU 1213 How Many Tables

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

思路:简单的并查集:

实现代码:

#include <iostream>
#include <cstdio>
using namespace std;

const int maxn=1005;
int par[maxn],rk[maxn];

void init(int n){
    for(int i=1;i<=n;i++){
        par[i]=i;
        rk[i]=0;
    }
}

int findfa(int u){
    if(par[u]==u)
        return u;
    return par[u]=findfa(par[u]);
}

void unit(int u,int v){
    u=findfa(u);
    v=findfa(v);

    if(u==v) return;

    if(rk[u]>rk[v])
        par[v]=u;
    else{
        par[u]=v;
        if(rk[u]==rk[u])
            rk[v]++;
    }
}

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int n,m;
        scanf("%d%d",&n,&m);
        init(n);

        for(int i=1;i<=m;i++){
            int a,b;
            scanf("%d%d",&a,&b);
            unit(a,b);
        }

        int sum=0;
        for(int i=1;i<=n;i++)
            if(par[i]==i)
               sum++;
        printf("%d\n",sum);
    }
}

 

posted on 2017-03-02 09:42  mkfoy  阅读(167)  评论(0编辑  收藏  举报

导航