zoj1789(并查集)
2014-01-17 15:04
218 查看
#include<stdio.h>
int father[30004];
void set(int n)
{
for(int i=0;i<n;i++)
father[i]=i;
}
int find(int x)
{
if(x==father[x])
return father[x];
return find(father[x]);
}
void merge(int a,int b)
{
int x=find(a);
int y=find(b);
if(x<=y)
father[y]=x;
else
father[x]=y;
}
int main()
{
int m,n;
while(scanf("%d%d",&m,&n),(m+n))
{
set(m);
while(n--)
{
int p;
scanf("%d",&p);
int num1,num2;
scanf("%d",&num1);
for(int i=1;i<p;i++)
{
scanf("%d",&num2);
merge(num1,num2);
}
}
int ans=0;
for(int i=0;i<m;i++)
{
if(find(0)==find(i))
ans++;
}
printf("%d\n",ans);
}
return 0;
}
int father[30004];
void set(int n)
{
for(int i=0;i<n;i++)
father[i]=i;
}
int find(int x)
{
if(x==father[x])
return father[x];
return find(father[x]);
}
void merge(int a,int b)
{
int x=find(a);
int y=find(b);
if(x<=y)
father[y]=x;
else
father[x]=y;
}
int main()
{
int m,n;
while(scanf("%d%d",&m,&n),(m+n))
{
set(m);
while(n--)
{
int p;
scanf("%d",&p);
int num1,num2;
scanf("%d",&num1);
for(int i=1;i<p;i++)
{
scanf("%d",&num2);
merge(num1,num2);
}
}
int ans=0;
for(int i=0;i<m;i++)
{
if(find(0)==find(i))
ans++;
}
printf("%d\n",ans);
}
return 0;
}
相关文章推荐
- zoj 1789 The Suspects (并查集)
- zoj 1789||poj 1611 The Suspects(并查集,简单)
- ACM zoj 1789(并查集实现)
- ZOJ1789(The Suspects)j简单并查集
- zoj 1789 || poj 1611 The Suspects(并查集)
- ZOJ 1789 水水的并查集,刚开始学会并查集,做了此题。经过一次失败后终于AC了哈哈~ AC感觉就是好啊!与大家共分享啊
- ZOJ2334 Monkey King 并查集 STL
- zoj1789-The Suspects
- ZOJ 3811 Untrusted Patrol 并查集
- ZOJ 3080 ChiBi(SPFA,并查集)
- zoj 3659 第37届ACM/ICPC 长春赛区现场赛E题 (并查集)
- zoj2334 Monkey King , 并查集,可并堆,左偏树
- zoj 2158 poj 1789 Truck History (Prim)
- ZOJ-3261(并查集续路径压缩,灵活应用)
- ZOJ 3659 Conquer a New Region 并查集
- ZOJ 3811 dfs&并查集
- ZOJ 3789 齿轮操作 带权并查集
- ZOJ2334 Monkey King 并查集 STL
- Zoj 3811并查集
- 并查集+贪心 Conquer a New Region HDU 4118 && ZOJ 3659