poj 并查集

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

水题

题意:就是找一共有多少个人感染了,0是感染学生的编号。

#include <stdio.h>
#include <string.h>
#define maxn 30005

int m,n;
int belg[ maxn ];

int Find(int x)
{
    int _x=x,_b;
    while( _x != belg[ _x ] )
        _x = belg[ _x ];
    while( x != belg[ x ] )
    {
        _b = belg[ x ];
        belg[ x ] = _x;
        x = _b;
    }
    return _x;
}

void unio(int x,int y)
{
    int root1 = Find(x);
    int root2 = Find(y);
    if( root1 != root2 ) belg[root2] = root1;
}

int main()
{
  //  freopen("in.txt","r",stdin);
    int a,b,c,ans;
    while(scanf("%d%d",&m,&n),m||n)
    {
        for( int i = 0 ; i <= m ; i++ )
            belg[ i ] = i;
        for( int i = 0 ; i < n ; i++ )
        {
            scanf("%d%d",&a,&b);
            for( int j = 0 ; j < a-1 ; j++ )
            {
                scanf("%d",&c);
                unio(b,c);
            }
        }
        ans = 0;
        a = Find(0);
        for(int i = 0 ; i <= m ; i++ )
            if(Find(i)==a) ans++;
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-11-08 06:10:43

poj 并查集的相关文章

[POJ]并查集三连发

整理一下最近的题解,这是三个并查集的题目,分别是: POJ 1182 食物链POJ 1611 The SuspectsPOJ 2524 Ubiquitous Religions POJ 1182 食物链 这个题有一个很棒的套路,那就是用一个并查集来维护三个集合内的元素,可以使这个并查集扩大n倍,然后按照元素是属于哪一个集合来进行运算,放入并查集对应范围内的对应位置.代码如下: #include <iostream> #include <cstdio> #include <cs

POJ 2524 Ubiquitous Religions (幷查集)

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

poj 2492 a bug&#39;s life 简单种类并查集

题意大致为找同性恋的虫子.... 这个比食物链要简单些.思路完全一致,利用取余操作实现关系之间的递推. 个人感觉利用向量,模和投影可能可以实现具有更加复杂关系的并查集. 1 #include<cstdio> 2 using namespace std; 3 const int MAXN=50010; 4 int fa[MAXN]; 5 int rel[MAXN]; // 0代表同类,1代表吃fa[i],2代表被吃 6 void _set(int n) 7 { 8 for(int i=1;i&l

poj 2513 并查集,Trie(字典树), 欧拉路径

- Colored Sticks POJ - 2513 You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some color. Is it possible to align the sticks in a straight line such that the colors of the endpoints that touch are of the same color?

[POJ 1988] Cube Stacking (带值的并查集)

题目链接:http://poj.org/problem?id=1988 题目大意:给你N个方块,编号从1到N,有两种操作,第一种是M(x,y),意思是将x所在的堆放到y所在的堆上面. 第二种是C(x),意思是数x方块下面有多少个方块. 把两堆合成一堆,这个可以用并查集来实现,问题是,怎么样维护x方块下面有多少个方块呢? 先来分析一下题目,按照样例,我们有6个方块,1,2,3,4,5,6. 令Cnt(x) = C(x)+1. 先执行M(1,6),此时Cnt(1) = 2, Cnt(6) = 1 再

HDU 1325 POJ 1308 Is It A Tree? (并查集)

这道题就是裸并查集,关键在于对不是树几种的判断 1. 空树是树 2. 森林不是树 3. 无环 或者从入度来看:1,无环:2,除了根,所有的入度为1,根入度为0:3,这个结构只有一个根,不然是森林了. 这道题本来暑假做的POJ 1308 但是HDU没有过.在于空树没有考虑. 用并查集判断有多少个森林注意编号是随机的,不是次序.... /* input: 0 0 1 1 0 0 1 2 1 2 0 0 1 2 2 3 4 5 0 0 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9

POJ 2492 (简单并查集) A Bug&#39;s Life

题意:有编号为1~n的虫子,开始假设这种昆虫是异性恋.然后已知xi 和 yi进行交配,根据已知情况分析能否推理出其中是否有同性恋 这道题和 POJ 1182 食物链 十分相似,不过在更新与父节点关系的时候要简单一些 sex数组保存的是与父节点的性别关系,如果与父节点是同性,则为0,否则是1 每次路径压缩的同时要更新sex[a] = (sex[a] + sex[temp]) % 2; 还有就是如果x 和 y 不在一个集合,两棵树进行合并的时候,考虑x px y py 四者之间的关系,有 paren

POJ 1984 Navigation Nightmare 二维带权并查集

题目来源:POJ 1984 Navigation Nightmare 题意:给你一颗树 k次询问 求2点之间的曼哈顿距离 并且要在只有开始k条边的情况下 思路:按照方向 我是以左上角为根 左上角为原点 dx[i]为i点距离根的x坐标 dy[]是y坐标 这两个可以通过路径压缩求出 只不过是二维而已 #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; const int m

[ACM] POJ 3295 Ubiquitous Religions (并查集)

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