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. usingnamespacestd;
  3. intpre[50010],num;
  4. intfind(inta);
  5. voidun(inta,intb);
  6. intmain()
  7. {
  8. intn,m;
  9. inti,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. return0;
  24. }
  25. intfind(inta)//路径压缩
  26. {
  27. intt=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. returnt;
  36. }
  37. voidun(inta,intb)
  38. {
  39. //intaa,bb;
  40. intaa,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. usingnamespacestd;
  4. shortpre[30001],num[30001];
  5. voidun(inta,intb);
  6. intfind(inta);
  7. intmain()
  8. {
  9. intn,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. un(temp,b);
  24. }
  25. }
  26. for(i=0;i<30001;i++)
  27. find(i);
  28. sort(pre,pre+30001);
  29. n=0,j=0;
  30. while(!pre[n++])j++;
  31. cout<<j<<endl;
  32. }
  33. return0;
  34. }
  35. intfind(inta)//未用路径压缩
  36. {
  37. intt;
  38. t=a;
  39. while(pre[t]!=t)t=pre[t];
  40. pre[a]=t;
  41. returnt;
  42. }
  43. voidun(inta,intb)
  44. {
  45. intaa,bb;
  46. aa=find(a);
  47. bb=find(b);
  48. if(aa==0)
  49. pre[bb]=aa;
  50. else
  51. pre[aa]=bb;
  52. }

你可能感兴趣的:(J#)