您的位置:首页 > 编程语言 > C语言/C++

HDU 1213 How Many Tables 并查集

2014-07-29 14:41 393 查看
这是一道简单的并查集的题目,跟UVA 10608 Friends
差不多。

对于统计桌子的数目,我用了两种方法:

1、先将桌子数目初始化为n,然后合并一次就减一张。

<span style="font-size:14px;">#include<stdio.h>
int fa[1001];
int find(int u)
{
fa[u]==u?u:fa[u]=find(fa[u]);
return fa[u];
}
int main()
{
int i,n,m,t,x,y,u,v,k;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
k=n;
for (i=1;i<=n;i++) fa[i]=i;
for (i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
x=find(u);y=find(v);
if (x!=y) {fa[x]=y;k--;}
}
printf("%d\n",k);
}
return 0;
}</span>

2、先将朋友们分好组,在统计 fa[i]=i 的这些根节点有多少即为所求的桌子数。

#include<stdio.h>
int fa[1001];
int find(int u)
{
fa[u]==u?u:fa[u]=find(fa[u]);
return fa[u];
}
int main()
{
int i,n,m,t,x,y,u,v,k;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++) fa[i]=i;
while (m--)
{
scanf("%d%d",&u,&v);
x=find(u);y=find(v);
if (x!=y) fa[x]=y;
}
k=0;
for(i=1;i<=n;i++)
if (find(i)==i) k++;
printf("%d\n",k);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 并查集 算法 HDU