标签: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;
}
标签:the suspects poj 1611 severe acute respira 并查集
原文地址:http://blog.csdn.net/darwin_/article/details/42803415