并查集
把和一个元素有关的集合合并起来方便查找
int pre[200010]; int init(int n) //n为初始化所有的元素 { for(int i=0;i<n;i++) { pre[i]=i; } } int find(int x) { if(pre[x]==x) { return x; } else { return pre[x]=find(pre[x]); //写pre[x]=find(pre[x])以加快后面的查找 } } void unite(int x,int y) { x=find(x); y=find(y); if(x!=y) { pre[x]=y; } return ; }
简单的模板应用题 http://poj.org/problem?id=1611
题意::0是感染者,和0一组的都是怀疑对象。即找到多少人和0在一个集合里
ac代码
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #define maxn 100010 #define inf 1000000 using namespace std; typedef long long LL; int pre[200010]; int b[200010]; int find(int x) { if(pre[x]==x) { return x; } else { return pre[x]=find(pre[x]); } } void unite(int x,int y) { x=find(x); y=find(y); if(x!=y) { pre[x]=y; } return ; } int main() { int m,n; while(cin>>m>>n) { if(m==0&&n==0) break; for(int i=0;i<m;i++) { pre[i]=i; } for(int i=0;i<n;i++) { int num; cin>>num; cin>>b[0]; for(int j=1;j<num;j++) { cin>>b[j]; unite(b[j],b[j-1]); } } int ans=0; for(int i=0;i<m;i++) { if(find(i)==find(0)) { ans++; } } cout<<ans<<endl; } return 0; }
吾志所向
一往无前
愈挫愈奋
再接再励
——卓

浙公网安备 33010602011771号