您的位置:首页 > 其它

HDU 1213 How Many Tables(并查集)

2014-07-24 16:37 363 查看
#include <iostream>

#include <cstdio>

using namespace std;

int sum, n, m;/*sum是需要的桌子数*/

int father[1005];/*用来存储自己所在的门派信息,哈哈*/

int main()

{

void makeset(int);

int findset(int);

void unionset(int,int);

int t;

scanf("%d", &t);

while(t--)

{

scanf("%d%d", &n, &m);

sum=n;/*刚开始的时候大家都不认识,需要n张桌子*/

makeset(n);/*将n个*/

int data1,data2;

for(int i=1; i<=m; i++)

{

scanf("%d%d",&data1,&data2);

unionset(data1,data2);

}

printf("%d\n",sum);

}

return 0;

}

void makeset(int n)//建一个大小为n的并查集

{

for(int i=1; i<=n; i++)

father[i]=i;

}

int findset(int x)//查找

{

if(x!=father[x])

father[x]=findset(father[x]);//回溯,路径压缩

return father[x];

}

void unionset(int a, int b)//合并,要用到findset查找函数

{

int x=findset(a);

int y=findset(b);

if(x==y)

return;

sum=sum-1;/*由于执行的是并操作,如果x和y不相等,证明两者原本不在一个集合里,

因此合并之后桌子总数要减去1,并且要把father[y]赋值为x,而不是把father[b]赋值为x*/

father[y]=x;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: