poj2524
2013-11-06 18:29
197 查看
题目大意:
问一个大学里学生的宗教,通过问一个学生可以知道另一个学生是不是跟他信仰同样的宗教。问学校里最多可能多少个宗教。也就是给定一个图的点数和相应的边,问有多少个连通分量。
解题思路:
用并查集,首先,使每个节点的根节点都指向自己,将根节点不相同的节点合并。要注意题目要求的输出格式。
c代码:
#include<stdio.h>
#include<string.h>
#define max 50010
int pre[max];
int s;
int find(int i)
{
if(pre[i]==i)
return i;
return find(pre[i]);
}
void sum(int i,int j)
{
int c=find(i),d=find(j);
if(c!=d)
{pre[c]=d;s--;}
}
int main()
{
int n,m,x,y,z=0;
while(scanf("%d %d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
memset(pre,0,sizeof(pre));
s=n;
for(int i=1;i<=n;i++)
pre[i]=i;
while(m--)
{
scanf("%d %d",&x,&y);
sum(x,y);
}
printf("Case %d: ",++z);
printf("%d\n",s);
}
getchar();
return 0;
}
问一个大学里学生的宗教,通过问一个学生可以知道另一个学生是不是跟他信仰同样的宗教。问学校里最多可能多少个宗教。也就是给定一个图的点数和相应的边,问有多少个连通分量。
解题思路:
用并查集,首先,使每个节点的根节点都指向自己,将根节点不相同的节点合并。要注意题目要求的输出格式。
c代码:
#include<stdio.h>
#include<string.h>
#define max 50010
int pre[max];
int s;
int find(int i)
{
if(pre[i]==i)
return i;
return find(pre[i]);
}
void sum(int i,int j)
{
int c=find(i),d=find(j);
if(c!=d)
{pre[c]=d;s--;}
}
int main()
{
int n,m,x,y,z=0;
while(scanf("%d %d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
memset(pre,0,sizeof(pre));
s=n;
for(int i=1;i<=n;i++)
pre[i]=i;
while(m--)
{
scanf("%d %d",&x,&y);
sum(x,y);
}
printf("Case %d: ",++z);
printf("%d\n",s);
}
getchar();
return 0;
}
相关文章推荐
- POJ2524_并查集
- POJ2524-宗教问题-并查集-ACM
- POJ2524:Ubiquitous Religions (并查集模板)
- 并查集入门题 hd1232 poj2524 hd1233 hd1213
- poj2524 Ubiquitous Religions
- poj2524 Ubiquitous Religions(并查集求组数)
- poj2524--Ubiquitous Religions
- poj2524
- [poj2524]Ubiquitous Religions
- POJ2524(并查集)
- poj2524 Ubiquitous Religions
- poj2524 并查集
- poj2524 Ubiquitous Religions
- poj2524
- poj2524 Ubiquitous Religions
- POJ2524 Ubiquitous Religions 暨并查集入门
- POJ2524(并查集)
- 并查集 POJ2524
- poj2524 Ubiquitous Religions
- 并查集水题 POJ2524