现在的位置: 首页 > 综合 > 正文

POJ_1611

2013年01月08日 ⁄ 综合 ⁄ 共 986字 ⁄ 字号 评论关闭

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;
}

 

抱歉!评论已关闭.