Ubiquitous Religions(无处不在的宗教)

poj 2524

并查集基础题,但是由于刚开始不熟悉,还是错了好几次

题目大意:有学生学号1--n,给你一些学生之间的关系,即属于同一宗教的学生, 找出共有多少不同的宗教数

解决:就是一个并查集的最基础题目,写个并查集就过了

#include <stdio.h>
#include <string.h>

int num[50005];
int n,m;

int find(int x)//查找
{
    if(num[x]<0)return x;
    return num[x]=find(num[x]);
}

void merge(int a,int b)//合并
{//就是因为对合并算法不熟悉,导致错误了好几次,fa和fb代表的是两个集合,而并非a,
int fa=find(a); int fb=find(b); int i; if(fa==fb)return; int t=num[fa]+num[fb]; if(num[fa]>num[fb]){num[fa]=fb;num[fb]=t;} else {num[fb]=fa;num[fa]=t;} } int main() { int icase=1; while(scanf("%d%d",&n,&m),n||m) { int a,b,i,count=0; memset(num,-1,sizeof(num)); for(i=0;i<m;i++) { scanf("%d%d",&a,&b); merge(a,b); } for( i=1;i<=n;i++) { if(num[i]<0)count++; } printf("Case %d: %d\n",icase++,count); } // system("pause"); return 0; }

转载于:https://www.cnblogs.com/hpustudent/archive/2011/07/23/2114964.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值