poj2524

题目连接:

题解:

普通的并查集 没什么特别的 下面看代码

#include<stdio.h>
#include<iostream>

using namespace std;

int bin[50010];
int findx(int x)
{
    return x == bin[x]?bin[x]:(bin[x] = findx(bin[x]));
}

int main()

{
    int n,m;
    int cas = 1;
    while(scanf("%d%d",&n,&m)&&m||n)
    {
        for(int i = 1;i <= n;i++)
        {
            bin[i] = i;
        }
        for(int i = 0;i < m;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            int fx,fy;
            fx = findx(a);
            fy = findx(b);
            if(fx != fy)
            {
                bin[fx] = fy;
            }
        }
        int sum = 0;
        for(int i = 1;i <= n;i++)
        {
            if(bin[i] == i)
            {
                sum++;
            }
        }
        printf("Case %d: %d\n",cas++,sum);
    }
    return 0;
}
时间: 2024-11-08 17:50:49

poj2524的相关文章

poj2524(简单并查集)

#include <iostream>#include <stdio.h>#include <string.h>#include <stdlib.h>using namespace std;int n,m;int bin[50001];int findx(int x){    int r=x;    while(r!=bin[r])        r=bin[r];    int j=x,k;    while(j!=r)    {        k=bin

POJ2524——Ubiquitous Religions

在说原型模式之前,我们先来看java里面的深复制和浅复制: 1. 浅复制:被复制的对象的所有变量都持有和原来对象的变量相同的值,而所有的对其他对象的引用都指向原来的对象. 2. 深复制:被复制对象的所有变量都含有与原来对象相同的值,除去那些引用其他变量的对象.那些引用其他对象的变量将指向被复制过来的新对象,而不是原来那些被引用的对象.深复制需要把要复制的对象的所有引用都复制一遍. 这两者的区别就是关于引用对象的处理,浅复制是不考虑引用对象,而深复制需要考虑引用对象的问题. 对java中的clon

POJ2524,Ubiquitous Religions

Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 23947   Accepted: 11792 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 findi

并查集-poj2524

以前只知道并查集的原理,并不知道具体实现有那些技巧. 一开始写并查集我把所有点的根全都初始化成0,然后find()等部分都写得很麻烦. 最普遍的写法是把每个点的根都设为自身,这样find就能写的很简便.具体看下面的代码实现 #include <cstdio> #include <cstring> int l[60000]; int fd(int a){ return a==l[a]?a:(l[a]=fd(l[a])); } int main(){ int n,m,a,b,ret,a

POJ2524 Ubiquitous Religions

Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 32294   Accepted: 15652 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 diffe

并查集水题 POJ2524

题意:一所学校有有n个学生,询问m对学生的宗教是否相同,求出这所学校最多有多少种宗教. 把宗教相同的学生连一条边,则未询问的学生默认他们没有边,最后连通块的个数就是宗教最多有多少个,并查集实现,把每个节点的最终父节点存到数组里,数组里不同元素的个数即为连通块的个数. 代码:

POJ2524并查集水题

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 stud

poj2524(Ubiquitous Religions)

题目大意: 一个学校里有N个学生,但每个学生对宗教的信仰不同.有M对同学,每一对的同学对宗教的信仰是相同的,让你求N个同学里最多有多少同学信仰着不同的宗教. 解题思路: 简单并查集.先建树,信仰同一宗教的同学在一个树上,然后查找有几棵树就可以了,查找多少棵树的方法就是统计祖先是是本身的个数即可. 代码: 1 #include <algorithm> 2 #include <iostream> 3 #include <sstream> 4 #include <cst

【POJ-2524】Ubiquitous Religions(并查集)

并查集. #include<cstdio> #include<cstring> using namespace std; const int maxn = 55555; int fa[maxn]; int vis[maxn]; int n,m,t; void init(){ for(int i = 0; i < n; i++) {fa[i] = i;} memset(vis,0,sizeof(vis)); } int find_father(int u){ return fa