标签: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