首页 > 代码库 > 并查集
并查集
The Suspects http://poj.org/problem?id=1611
1 #include<cstdio> 2 #include<cstring> 3 #define mt(a,b) memset(a,b,sizeof(a)) 4 const int M=30010; 5 class UnionFindSet { //并查集 6 int par[M],num[M]; 7 public: 8 int getnum(int id){ 9 return num[getroot(id)];10 }11 void init() {12 mt(par,-1);13 for(int i=0;i<M;i++) num[i]=1;14 }15 int getroot(int x) {16 int i=x,j=x,temp;17 while(par[i]>=0) i=par[i];18 while(j!=i) {19 temp=par[j];20 par[j]=i;21 j=temp;22 }23 return i;24 }25 bool unite(int x,int y) {26 int p=getroot(x);27 int q=getroot(y);28 if(p==q)return false;29 if(par[p]>par[q]) {30 par[q]+=par[p];31 par[p]=q;32 num[q]+=num[p];33 } else {34 par[p]+=par[q];35 par[q]=p;36 num[p]+=num[q];37 }38 return true;39 }40 }gx;41 int main(){42 int n,m,op,x,y;43 while(~scanf("%d%d",&n,&m),n|m){44 gx.init();45 while(m--){46 scanf("%d",&op);47 if(!op) continue;48 scanf("%d",&x);49 op--;50 while(op--){51 scanf("%d",&y);52 gx.unite(x,y);53 }54 }55 printf("%d\n",gx.getnum(0));56 }57 return 0;58 }
end
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。