2524 1611 并查集

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. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值