poj1611(并查集)
2012-08-12 13:03
309 查看
#include <stdio.h> using namespace std; int set[30005]; int num[30005]; void makeset(int n) { for(int i=0;i<n;i++) { set[i]=i; num[i]=1; } } int findset(int x) { if(x!=set[x]) { set[x]=findset(set[x]);//之所以不可以直接返回是因为这里可能有多层的关系 } return set[x]; } void Union(int a,int b) { int x=findset(a); int y=findset(b); if(x==y) { return ; } if(num[x]>=num[y]) { num[x]+=num[y]; set[y]=set[x]; } else { num[y]+=num[x]; set[x]=set[y]; } } int main() { int peopleNum,groupNum,eachNum,first,index; while(1) { scanf("%d %d",&peopleNum,&groupNum); if(peopleNum==0 && groupNum==0) break; makeset(peopleNum);// for(int k=0;k<groupNum;k++) { scanf("%d %d",&eachNum,&first); for(int j=1;j<eachNum;j++) { scanf("%d",&index); Union(first,index); } } printf("%d\n",num[findset(0)]); } return 0; }
其实就那么几个函数,搞明白了关系就行了,可以看下接下来写的模板
相关文章推荐
- poj1611(The Suspects)-并查集基础题
- poj1611(带权并查集)
- poj1611-The Suspects--并查集
- [POJ1611]The Suspects(并查集)
- 并查集专题练习(一)POJ1611
- poj1611 带权并查集
- poj1611(并查集)
- 【遇到SARS不要慌,让我们找到谁是可疑感染者!!】 并查集--poj1611
- POJ1611 && POJ2524 并查集入门
- poj1611(简单并查集)
- 并查集:poj1611
- poj1611 The Suspects(基础并查集)
- poj1611 The Suspects 并查集
- POJ1611(The Suspects)又见并查集
- POJ1611 && POJ2524 并查集入门
- POJ1611(简单并查集)
- POJ1611 The Suspects(并查集)
- POJ1611 并查集
- 并查集初学(3)无间道之并查集 && POJ2542 && POJ1611
- POJ1611->并查集