`

数据结构 并查集——poj 2524

阅读更多

题目描述:

     世界上宗教何其多。假设你对自己学校的学生总共有多少种宗教信仰很感兴趣。学校有n个学生,但是你不能直接问学生的信仰,不然他会感到很不舒服的。有另外一个方法是问m对同学,是否信仰同一宗教。根据这些数据,相信聪明的你是能够计算学校最多有多少种宗教信仰的。(好,不罗嗦那么多了)

  解题思路---->显然并查集了。并查集的详细解释在可以点击 并查集(不相交集合)进行学习。思路可以很清晰的,一开始假设大家都各自信仰一个宗教,那么总的数目ans就是学生数目,每当发现有一对学生信仰同一个宗教,那么ans--;

#include <stdio.h>
#include <iostream>
using namespace std;

const int MAXN = 50005; /*结点数目上线*/
int pa[MAXN];    /*p[x]表示x的父节点*/
int rank[MAXN];    /*rank[x]是x的高度的一个上界*/
int n, ans; 

void make_set(int x)
{/*创建一个单元集*/
    pa[x] = x;
    rank[x] = 0;
}

int find_set(int x)
{/*带路径压缩的查找*/
    if(x != pa[x])
        pa[x] = find_set(pa[x]);
    return pa[x];
}

/*按秩合并x,y所在的集合*/
void union_set(int x, int y)
{
    x = find_set(x);
    y = find_set(y);
    if(x == y)return ;
    ans--;    //统计
    if(rank[x] > rank[y])/*让rank比较高的作为父结点*/
    {
        pa[y] = x;
    }
    else 
    {
        pa[x] = y;
        if(rank[x] == rank[y])
            rank[y]++;
    }
}
//answer to 2524
int main()
{
    int m, i, j = 1, x, y;
    while(scanf("%d%d", &n, &m))
    {
        if(n == m && m == 0) break;
        for(i = 1; i <= n; i++)
            make_set(i);
        ans = n;
        for(i = 0; i < m; i++)
        {
            scanf("%d%d", &x, &y);
            union_set(x, y);
        }
        printf("Case %d: %d\n", j, ans);
        j++;
    }
    return 0;
}

 

分享到:
评论

相关推荐

    强大的POJ分类——各类编程简单题及其算法分类

    3. **并查集**:处理集合合并和查询问题。 4. **哈希表** 和 **二分查找**:提供高效查找能力,如POJ3349、3274、2151、1840、2002和2503。 5. **哈夫曼树**:用于压缩编码,如POJ3253。 6. **堆**:用于优先队列和...

    POJ ACM 1015 Jury Compromise

    “Jury Compromise”题目的解法展示了图论和动态规划、并查集等数据结构在实际问题中的应用。通过深入学习和实践,不仅能提升编程能力,也有助于培养解决问题的逻辑思维。无论是参赛者还是算法爱好者,都应该多加...

    ACM算法总结大全——超有用!

    3. 并查集:处理集合合并与查询,如poj3349。 4. 哈希表和二分查找:快速查找,如poj3274、poj2151等。 5. 哈夫曼树:用于压缩编码,如poj3253。 6. 堆:优先队列实现,如poj1459。 7. Trie树:用于高效字符串查询,...

    ACM算法总结大全——超有用!.pdf

    4. **数据结构**:线段树、静态二叉检索树、树状数组、RMQ、并查集的高级应用和KMP算法。 5. **搜索**:最优化剪枝、搜索技巧和优化、记忆化搜索。 6. **动态规划**:处理更复杂的问题,如动态规划解施行商问题等...

    多种解题技巧POJ1035_Spelling Checker

    今天我们将深入探讨一个特定的题目——"POJ1035_Spelling Checker",并分析其中涉及到的多种解题技巧。 首先,我们要理解题目的核心:实现一个拼写检查器,对输入的单词进行检查,判断其是否正确。这需要我们具备...

    挑战程序设计竞赛(第2版)

    2.4.4 并查集 2.5 它们其实都是“图” 2.5.1 图是什么 2.5.2 图的表示 2.5.3 图的搜索 2.5.4 最短路问题 2.5.5 最小生成树 2.5.6 应用问题 2.6 数学问题的解题窍门 2.6.1 辗转相除法 2.6.2 有关素数的基础算法 2.6.3...

    最小生成树题解1

    在实际编程时,还需要注意数据结构的选择,例如使用优先队列(二叉堆)优化 Prim 算法,或者使用并查集(Disjoint Set)优化 Kruskal 算法,以提高效率。在处理大规模数据时,考虑时间复杂度和空间复杂度的平衡也是...

    算法之路 ,成功掌握各种算法

    - **Kruskal算法**:基于并查集的数据结构,按边的权重从小到大排序后逐条考虑加入生成树,直到生成树包含所有顶点为止。 ##### 3. 大数运算 - 高精度加减乘除:当数字超出标准整数或浮点数类型所能表示的范围时,...

Global site tag (gtag.js) - Google Analytics