[hdu1213] How Many Tables

来源:互联网 发布:js获取本周第一天日期 编辑:程序博客网 时间:2024/05/16 07:32

题目链接

题解:求连通分支的个数.
两种方式:
1.可以求出一共有多少个根节点(即fa[i]==i的个数)
2.可以用原始连通分量数n 减去有效的合并次数。
即每次合并两个连通分量就会使得总的分量数目减少1.

#include <iostream>#include <cstdio>using namespace std;int n,m,p,q;int T,ans;int f[1005],rk[1005];inline int find(int x){    if(f[x]==x) return x;    int t=find(f[x]);    f[x]=t;    return f[x];}inline void ready(){    for(int i=1;i<=n;i++)     f[i]=i,rk[i]=0;     ans=n;}inline void uniom(int p,int q){    int x=find(p),y=find(q);    if(x==y) return ;    ans--;//每合并一对,总数就-1     if(rk[x]>rk[y])      f[y]=x;      else      {        f[x]=y;       if(rk[x]==rk[y])        rk[y]++;    } }inline void work(){    scanf("%d%d",&n,&m);     ready();    for(int i=1;i<=m;i++)    {        scanf("%d%d",&p,&q);        uniom(p,q);    }    printf("%d\n",ans);}int main(){    cin>>T;     while(T--){        work();    }    return 0;}
0 0