poj1611

   1:  /************************************************************************/
   2:  /* *Author:justinzhang
   3:  /*Email:uestczhangchao@gmail.com
   4:  /*Establish:2011年5月14日16:43:46
   5:  /*Discription:算法导论22章并查集                                                                     */
   6:  /************************************************************************/
   7:   
   8:  #include<iostream>
   9:  using namespace std;
  10:   
  11:  /*
  12:  *rank[]是用来存放元素x秩的数组,p[]是用来存放元素x父节点的数组
  13:  *Make_Set()用来初始化集合元素,刚开始的时候每个元素独立为一个集合
  14:  */
  15:  void Make_Set(int rank[],int p[],int x)
  16:  {
  17:      p[x] = x;
  18:      rank[x] = 0;
  19:  }
  20:   
  21:  /************************************************************************/
  22:  /* 寻找x元素所属的集合                                                                     */
  23:  /************************************************************************/
  24:  int Find_Set(int p[],int x)
  25:  {
  26:      if(p[x]!=x)
  27:      {
  28:          p[x] = Find_Set(p,p[x]);
  29:      }
  30:      
  31:          return p[x];
  32:   
  33:  }
  34:   
  35:   
  36:  /************************************************************************/
  37:  /* 合并两个集合                                                                     */
  38:  /************************************************************************/
  39:  void Union(int rank[],int p[],int x, int y)
  40:  {
  41:      int px = Find_Set(p,x);
  42:      int py = Find_Set(p,y);
  43:      if (rank[px]>rank[py])
  44:      {
  45:          p[py] = px;
  46:      }
  47:      else
  48:      {
  49:          p[px] = py;
  50:          if (rank[px]==rank[py])
  51:          {
  52:              rank[py]++;
  53:          }
  54:      }
  55:  }
  56:   
  57:  int main()
  58:  {
  59:      int n, m;
  60:      int rank[30003];
  61:      int p[30003];
  62:      int numsuspect;
  63:      int personnum;
  64:      int firstpersonnum;
  65:      int groupnum;
  66:      int i,j;
  67:      while(1)
  68:      {
  69:          numsuspect = 0;
  70:          memset(rank,0,sizeof(rank));
  71:          memset(p,0,sizeof(p));
  72:          cin >> n >> m;//n为学生人数,m为学生的分组数
  73:          if(n==0 && m==0)
  74:              break;
  75:          for(j=0;j<n;j++)
  76:              Make_Set(rank,p,j);
  77:          while((--m)>=0)
  78:          {
  79:              cin>>groupnum;
  80:              if (groupnum>=1)
  81:              {
  82:                  cin>>firstpersonnum;
  83:              }
  84:   
  85:              for(i=1;i<groupnum;i++)
  86:              {
  87:                  cin >> personnum;
  88:                  Union(rank,p,firstpersonnum,personnum);
  89:              }
  90:              
  91:          }
  92:          for (j=0;j<n;j++)
  93:          {
  94:              if (Find_Set(p,0)==Find_Set(p,j))
  95:              {
  96:                  numsuspect++;
  97:              }
  98:          }
  99:          cout << numsuspect << endl;
 100:   
 101:      }
 102:      system("pause");
 103:      return 0;
 104:  }
 105:   
posted @ 2011-09-01 16:48  justinzhang  阅读(432)  评论(0编辑  收藏  举报