poj2524

题目大意:

     问一个大学里学生的宗教,通过问一个学生可以知道另一个学生是不是跟他信仰同样的宗教。问学校里最多可能多少个宗教。也就是给定一个图的点数和相应的边,问有多少个连通分量。

解题思路:

     用并查集,首先,使每个节点的根节点都指向自己,将根节点不相同的节点合并。要注意题目要求的输出格式。

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值