HDU1213并查集基础

来源:互联网 发布:成都妇女儿童医院网络 编辑:程序博客网 时间:2024/06/05 14:19

题意:给出总人数与数对两两间的“朋友”关系 将所有有朋友的人坐在一起 求所需要桌子的数量
题意抽象化:所有有关系的人相连成树 即m个合并操作后 求树的个数(根节点的个数)

#include<iostream>#include<stdio.h>#include<string.h>#include<algorithm>#include<math.h>using namespace std;int t,n,m,parent[1005],rank1[1005],a[1005],s,k,mark;int find(int x)//找父节点 {    if(parent[x]==x)        return x;    return find(parent[x]);}void Union(int a,int b)//合并a,b两个子树 {    a=find(a);    b=find(b);    if(rank1[a]>rank1[b])        parent[b]=a;    else if(rank1[a]<rank1[b])    {        parent[a]=b;        }    else    {        parent[a]=b;        rank1[b]++;    }}int main(){    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        mark=0;        memset(ans,0,sizeof(ans));        for(int i=1;i<=n;i++)        {            parent[i]=i;            rank1[i]=0;        }        for(int i=0;i<m;i++)        {            scanf("%d%d",&s,&k);            Union(s,k);        }        for(int i=1;i<=n;i++)        {            if(parent[i]==i)//mark记录根节点个数(一个根节点代表一棵树)                 mark++;        }        printf("%d\n",mark);    }} 

并查集就和微信 QQ的推荐好友一样 从并查集的视角来看 一般会把和我们是同一个树 但却未建立好友关系的人作为推荐好友推荐给我们

1 0
原创粉丝点击