码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 1611 The Suspects (并查集)

时间:2015-01-17 10:02:32      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:the suspects   poj 1611   severe acute respira   并查集   

简单并查集,没什么好说的。  题目连接:请戳这里。

题目大意:0一定是SARS,和SARS在一起的一定是SARS,求0~n-1中共有多少个SARS;

思路:回顾下并查集,顾名思义,并查集的作用不就的“并”和“查”嘛。并查集的功能描述为:合并两个集合;将一元素并入另一集体;判断两个元素是否属于同一个集合。

题目也是给你m个集合咯。所以很简单咯。

~~~~

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define N 30000+10
using namespace std;

int f[N],Rank[N];
void Init(int n)
{
    for(int i=0;i<n;i++)
    {
        f[i]=i;
        Rank[i]=1;
    }
}
int Find(int x)
{
    return f[x]==x?x:f[x]=Find(f[x]);  // ~.~
}
void Merge(int a,int b)
{
    int ra=Find(a),rb=Find(b);
    if(ra==rb) return ;
    else if(Rank[ra]>Rank[rb])
        f[rb]=ra;
    else if(Rank[ra]<Rank[rb])
        f[ra]=rb;
    else{
        f[rb]=ra;
        Rank[ra]++;
    }
}
int main()
{
    int n,m;
    while(scanf("%d %d",&n,&m),n||m)
    {
        Init(n);
        for(int i=0;i<m;i++)
        {
            int k,s;
            scanf("%d %d",&k,&s);
            for(int j=1;j<k;j++)
            {
                int t;
                scanf("%d",&t);
                Merge(s,t);
            }
        }
        int ans=1;
        for(int i=1;i<n;i++)    //不能用f[0]==f[i] ~.~
            if(Find(i)==Find(0)) ans++;
        printf("%d\n",ans);
    }
    return 0;
}



POJ 1611 The Suspects (并查集)

标签:the suspects   poj 1611   severe acute respira   并查集   

原文地址:http://blog.csdn.net/darwin_/article/details/42803415

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!