POJ_1611

http://acm.pku.edu.cn/JudgeOnline/problem?id=1611

 

 

#include "stdio.h"
#include "stdlib.h"
#include <iostream>
using namespace std;

const int MAXSIZE = 30002;
int parent[MAXSIZE];   //记录父节点
int num[MAXSIZE];     //记录节点所在集合的元素的个数

void initial(int n){
 for(int i=0;i<n;i++){
    parent[i] = i;     //初试化,每个元素为一个集合
    num[i] = 1;
 }
}

//寻找根节点
int findparent(int x){
 int r = x;
 while(r!=parent[r]){
   r  = parent[r];
 }

 return r;
}


//合并两个集合 a,b分别是两个集合的根,用根代表集合
void unionset(int a,int b){
 if(a==b){
  return;
 }
  
 //小集合并到大集合里
    if(num[a]<num[b]){
          parent[a] = b;
    num[b] = num[b] + num[a];
 }else{
           parent[b] = a;
     num[a] = num[b] + num[a];
 }
}

 

int main(){
  
 freopen("data.txt","r",stdin);

   int n,m;
   int a,b;
   int i,k;
  
   while(scanf("%d %d",&n,&m)&&n+m!=0){
    initial(n);
    while(m-->0){
       scanf("%d",&k);
       scanf("%d",&a);
       for(i=1;i<k;i++){
          scanf("%d",&b);
    int roota = findparent(a);
    int rootb = findparent(b);
    unionset(roota,rootb);    //合并两个集合
    }
    }

      int root =  findparent(0);
      printf("%d/n",num[root]);
   }

   return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值