POJ-2524,Ubiquitous Religions(并查集模板题)

简介: POJ-2524,Ubiquitous Religions(并查集模板题)

Problem Description:


There are so many different religions in the world today that it is difficult to keep track of them all. You are interested in finding out how many different religions students in your university believe in.


You know that there are n students in your university (0 < n <= 50000). It is infeasible for you to ask every student their religious beliefs. Furthermore, many students are not comfortable expressing their beliefs. One way to avoid these problems is to ask m (0 <= m <= n(n-1)/2) pairs of students and ask them whether they believe in the same religion (e.g. they may know if they both attend the same church). From this data, you may not know what each person believes in, but you can get an idea of the upper bound of how many different religions can be possibly represented on campus. You may assume that each student subscribes to at most one religion.  


Input:


The input consists of a number of cases. Each case starts with a line specifying the integers n and m. The next m lines each consists of two integers i and j, specifying that students i and j believe in the same religion. The students are numbered 1 to n. The end of input is specified by a line in which n = m = 0.  


Output:


For each test case, print on a single line the case number (starting with 1) followed by the maximum number of different religions that the students in the university believe in.


Sample Input:


10 9


1 2


1 3


1 4


1 5


1 6


1 7


1 8


1 9


1 10


10 4


2 3


4 5


4 8


5 8


0 0  

Sample Output:


Case 1: 1


Case 2: 7  


程序代码:  


#include<stdio.h>
#define MAXN 50001
int f[MAXN];
int getf(int v)
{
  if(f[v]==v)
    return v;
  else
  {
    f[v]=getf(f[v]);
    return f[v];
  }
}
void merge(int v,int u)
{
  int t1=getf(v);
  int t2=getf(u);
  if(t1!=t2)
    f[t2]=t1;
  return ;
}
int main()
{
  int n,m,ans=1;
  while(scanf("%d %d",&n,&m)!=EOF)
  {
    if(n==0&&m==0)
      break;
    for(int i=1;i<=n;i++)
      f[i]=i;
    int x,y,sum=0;
    while(m--)
    {
      scanf("%d %d",&x,&y);
      merge(x,y);
    }
    for(int i=1;i<=n;i++)
    {
      if(f[i]==i)
        sum++;
    }
    printf("Case %d: %d\n",ans++,sum);
  }
  return 0;
}


相关文章
|
算法 数据库 开发者
[软件工程导论(第六版)]第3章 需求分析(复习笔记)
[软件工程导论(第六版)]第3章 需求分析(复习笔记)
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的校园二手书交易平台的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的校园二手书交易平台的详细设计和实现(源码+lw+部署文档+讲解等)
379 1
|
测试技术 uml
UML—浅谈常用九种图
UML—浅谈常用九种图
660 0
|
算法
动态规划:从入门到入土系列(一)
动态规划:从入门到入土系列(一)
173 0
|
传感器 定位技术
c51实现老人跌倒,心率异常报警系统
c51实现老人跌倒,心率异常报警系统
476 0
c51实现老人跌倒,心率异常报警系统
十分钟手撕栈与队列——栈与队列实现详解
栈🤔 首先应该搞清楚的是什么的是栈,栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出 LIFO(Last In First Out)的原则。
十分钟手撕栈与队列——栈与队列实现详解
Qt-第一个QML程序-4-自定义按钮类,动画,状态
上篇中,我们写到了自己定义了一个按钮,但是呢,按照这样的写法,要写一个程序出来,那要累死了,所以,qml给我的感觉就是各种随便调用,所以了,可以自己写一个自己Button的qml,这样在以后用到了,就可以直接使用了。
546 0
Qt-第一个QML程序-4-自定义按钮类,动画,状态
天下大势,分久闭合,合久必分
我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
640 0
|
C++ 算法 网络架构