您的位置:首页 > 其它

poj1611 带权并查集

2015-09-07 14:41 169 查看
题意:病毒蔓延,现在有 n 个人,其中 0 号被认为可能感染,然后给出多个社交圈,如果某个社交圈里有人被认为可能被感染,那么所有这个社交圈里的人都被认为可能被感染,现在问有多少人可能被感染。

带权并查集,给每个集合加入这个集合的总人数,合并集合是一起合并就可以了。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int n,fa[30005],num[30005];

void init(){
for(int i=0;i<n;i++){fa[i]=i;num[i]=1;}
}

int find(int x){
int r=x,t;
while(fa[r]!=r)r=fa[r];
while(x!=r){
t=fa[x];
fa[x]=r;
x=t;
}
return r;
}

int main(){
int m;
while(scanf("%d%d",&n,&m)!=EOF&&(n!=0||m!=0)){
init();
int i,j;
for(i=1;i<=m;i++){
int t,a,b;
cin>>t;
for(j=1;j<=t;j++){
cin>>a;
if(j==1)b=a;
else{
int x=find(a),y=find(b);
if(x!=y){
fa[x]=y;
num[y]+=num[x];
}
}
}
}
int x=find(0);
printf("%d\n",num[x]);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: