2524 1611 并查集

来源:互联网 发布:丙子胡乱知乎 编辑:程序博客网 时间:2024/06/06 01:10

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

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

code 2524

 

  1. #include<iostream>
  2. using namespace std;
  3. int   pre[50010],num;
  4. int find(int a);
  5. void un(int a,int b);
  6. int main()
  7. {
  8.  int n,m;
  9.  int i,a,b,T(1);
  10.  freopen("in.txt","r",stdin);
  11.  while(cin>>n>>m&&n&&m)
  12.  {
  13.   num=n;//初始化是每个人的信仰都不同
  14.   for( i=1; i<=50005; i++)
  15.    pre[i]=0;
  16.   for( i=1; i<=m; i++)
  17.   {
  18.   scanf("%d%d",&a,&b);
  19.    un(a,b);
  20.   }
  21.   cout<<"Case "<<T++<<": "<<num<<endl;
  22.  }
  23.  return 0;
  24. }
  25. int find(int a)//路径压缩
  26. {
  27.  int t=a,z;
  28.  while(pre[t]!=0)t=pre[t];
  29.  while(a!=t)
  30.  {
  31.   z=pre[a];
  32.   pre[a]=t;
  33.   a=z;
  34.  }
  35.  return t;
  36. }
  37. void un(int a,int b)
  38. {
  39.  //int aa,bb;
  40.  int aa,bb;
  41.  aa=find(a);
  42.  bb=find(b);
  43.  if(aa==bb&&aa)//祖先一样的情况
  44.   return;
  45.  if(aa==0)
  46.  pre[bb]=aa;
  47.  else 
  48.   pre[aa]=bb;
  49.  num--;
  50. }

code 1611

  1. #include<iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. short pre[30001],num[30001];
  5. void un( int a, int b);
  6. int find(int a);
  7. int main()
  8. {
  9.     int n, i, m,a,j,b,temp;
  10.   freopen("in.txt","r",stdin);
  11.     while(cin>>n>>m&&m||n)
  12.     {
  13.         for( i=0; i<30001; i++)
  14.             pre[i]=i;
  15.         for( i=0; i<m; i++)
  16.         {
  17.             cin>>a;
  18.             for( j=0; j<a; j++)
  19.             {
  20.                 cin>>b;
  21.                 if(j==0)
  22.                     temp=b;
  23.                 
  24.                 
  25.                 un(temp,b);
  26.             }
  27.         }
  28.         for( i=0; i<30001; i++)
  29.             find(i);
  30.         sort(pre,pre+30001);
  31.         n=0,j=0;
  32.         while(!pre[n++]) j++;
  33.         cout<<j<<endl;
  34.     }
  35.     return 0;
  36. }
  37. int find( int a)//未用路径压缩
  38. {
  39.     int t;
  40.     t=a;
  41.     while(pre[t]!=t) t=pre[t];
  42.     pre[a]=t;
  43.     return t;
  44. }
  45. void un( int a, int b)
  46. {
  47.     int aa,bb;
  48.     aa=find(a);
  49.     bb=find(b);
  50.     if(aa==0)
  51.     pre[bb]=aa;
  52.     else 
  53.         pre[aa]=bb;
  54. }
原创粉丝点击