您的位置:首页 > 其它

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;

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