kuangbin专题五 并查集 POJ 1213 How Many Tables

来源:互联网 发布:中文域名重要性 编辑:程序博客网 时间:2024/06/05 10:58

题意:
一个人生日,他决定叫他的朋友们来他家开派对,但是这些朋友当中有的不认识彼此,有的认识彼此,朋友们都希望与直接认识的人坐在同一桌,所以要你写个程序出来找到最小需要的桌子数。
题解:
基础并查集。

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int MAXN=1e3+7;int f[MAXN];int size[MAXN];void init(){    for(int i=1;i<=1e3;i++)    f[i]=i,size[i]=i;}int find(int p){    while(p!=f[p])    {        f[p]=f[f[p]];        p=f[p];    }    return p;}void Union(int p,int q){    int P=find(p);    int Q=find(q);    if(q==p)    return ;    if(size[P]>=size[Q])    {        size[P]+=size[Q];        f[Q]=P;    }    else    {        size[Q]+=size[P];        f[P]=Q;         }}int main(){    int n,m,t;    scanf("%d",&t);    while(t--)    {        init();        scanf("%d%d",&n,&m);        for(int i=1;i<=m;i++){            int u,v;            scanf("%d%d",&u,&v);            Union(u,v);        }        int sum=0;        for(int i=1;i<=n;i++)        if(f[i]==i)        sum++;        printf("%d\n",sum);    }}