题目链接:

http://poj.org/problem?id=2524

Ubiquitous Religions
Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 39369   Accepted: 18782

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

  1. 10 9
  2. 1 2
  3. 1 3
  4. 1 4
  5. 1 5
  6. 1 6
  7. 1 7
  8. 1 8
  9. 1 9
  10. 1 10
  11. 10 4
  12. 2 3
  13. 4 5
  14. 4 8
  15. 5 8
  16. 0 0

Sample Output

  1. Case 1: 1
  2. Case 2: 7

Hint

Huge input, scanf is recommended.
分析:
裸的并查集(我觉得叫查并集更好)
代码如下:
  1. #include<stdio.h>
  2. #include<iostream>
  3. using namespace std;
  4. #define max_v 50005
  5. int pa[max_v];//pa[x] 表示x的父节点
  6. int rk[max_v];//rk[x] 表示以x为根结点的树的高度
  7. int n,ans;
  8. void make_set(int x)
  9. {
  10. pa[x]=x;
  11. rk[x]=0;//一开始每个节点的父节点都是自己
  12. }
  13. int find_set(int x)//带路径压缩的查找
  14. {
  15. if(x!=pa[x])
  16. pa[x]=find_set(pa[x]);
  17. return pa[x];
  18. }
  19. void union_set(int x,int y)
  20. {
  21. x=find_set(x);//找到x的根结点
  22. y=find_set(y);
  23. if(x==y)//根结点相同 同一棵树
  24. return ;
  25. ans--;
  26. if(rk[x]>rk[y])
  27. {
  28. pa[y]=x;
  29. }else
  30. {
  31. pa[x]=y;
  32. if(rk[x]==rk[y])
  33. rk[y]++;
  34. }
  35. }
  36. int main()
  37. {
  38. int n,m,j=0;
  39. while(~scanf("%d %d",&n,&m))
  40. {
  41. if(m+n==0)
  42. break;
  43. for(int i=1;i<=n;i++)
  44. {
  45. make_set(i);
  46. }
  47. ans=n;
  48. for(int i=0;i<m;i++)
  49. {
  50. int x,y;
  51. scanf("%d %d",&x,&y);
  52. union_set(x,y);
  53. }
  54. printf("Case %d: %d\n",++j,ans);
  55. }
  56. return 0;
  57. }

  

POJ 2524 独一无二的宗教(裸并查集)的更多相关文章

  1. poj 2524:Ubiquitous Religions(并查集,入门题)

    Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 23997   Accepted:  ...

  2. POJ 2524 Ubiquitous Religions (并查集)

    Description 当今世界有很多不同的宗教,很难通晓他们.你有兴趣找出在你的大学里有多少种不同的宗教信仰.你知道在你的大学里有n个学生(0 < n <= 50000).你无法询问每个 ...

  3. poj 2524 Ubiquitous Religions(简单并查集)

    对与知道并查集的人来说这题太水了,裸的并查集,如果你要给别人讲述并查集可以使用这个题当做例题,代码中我使用了路径压缩,还是有一定优化作用的. #include <stdio.h> #inc ...

  4. poj 2524 Ubiquitous Religions(并查集)

    Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 23168   Accepted:  ...

  5. poj 2524 求连通分量(并查集模板题)

    求连通分量 Sample Input 10 91 21 31 41 51 61 71 81 91 1010 42 34 54 85 80 0Sample Output Case 1: 1Case 2: ...

  6. POJ 2524 Ubiquitous Religions 【并查集】

    解题思路:输入总人数 n,和m组数据:即和杭电畅通工程相类似,对这m组数据做合并操作后,求最后一共有多少块区域. #include<stdio.h> int pre[50001]; int ...

  7. poj 2236:Wireless Network(并查集,提高题)

    Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 16065   Accepted: 677 ...

  8. 【POJ】The Suspects(裸并查集)

    并查集的模板题,为了避免麻烦,合并的时候根节点大的合并到小的结点. #include<cstdio> #include<algorithm> using namespace s ...

  9. poj 1182:食物链(种类并查集,食物链问题)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44168   Accepted: 12878 Description ...

随机推荐

  1. Gradle修改缓存路径 和 Gradle修改Maven仓库地址

    Gradle修改缓存路径 修改gradle启动脚本进入gradle安装的bin目录,使用文本编辑器打开gradle.bat文件,在如图的位置添加以下语句 set GRADLE_OPTS="- ...

  2. C#学习笔记-外观模式

    题目:股民买卖股票 实现: static void Main(string[] args) { Stock1 gu1 = new Stock1(); Stock2 gu2 = new Stock2() ...

  3. csharp: SQL Server 2005 Database Backup and Restore using C#

    1.第一种方式: using SQLDMO;//Microsoft SQLDMO Object Library 8.0 /// <summary> /// 数据库的备份 /// 涂聚文注: ...

  4. Python power spectral 功率谱

    You can also use scipy.signal.welch to estimate the power spectral density using Welch’s method. Her ...

  5. Get a “step-by-step” evaluation in Mathematica

    Is it possible in Mathematica to get a step-by-step evaluation of some functions; that's to say, out ...

  6. flask多线程多协程操作

    local的作用:各个线程各开辟一块空间互不影响 基于local""" import threading from threading import local impo ...

  7. java indexOf 和 split的用法

    1.java 的 indexOf 方法 ,如果存在 则 指定的字符串的开始位置,如果不存在 则返回-1: 2.java 的 split的方法:将一个字符串分割为子字符串,然后将结果作为字符串数组返回. ...

  8. 如何安装window7 语言包

    很多下载的语言包都是.exe文件,双击后生成lp.cab文件. 这时马上把文件复制到另外一个文件夹中,直接拖最快. 这是 window7 sp1 的很多语言包下载地址(企业版和旗舰版通用):http: ...

  9. c# 设计模式 之:工厂模式之---工厂模式

    1.uml类图: 实现和依赖关系: 实现: SportFactory.JeepFactory.HatchbackFactory 实现 IFactory 接口 SportCar.JeepCar.Hatc ...

  10. Struts 2 官方文档中文版

    最近正在学 Struts 2 ,咱英文水平不行啊,找到了<Struts 2 官方文档中文版>,虽然翻译的不全,有总比没有强. 地址:https://cwiki.apache.org/con ...