扩展并查集——POJ - 1182

桃扇骨 2021-11-22 09:28 382阅读 0赞

题目含义

找出与之前的话不符的假话的数目

题目分析

简单的扩展并查集

题目代码

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<algorithm>
  5. using namespace std;
  6. typedef long long LL;
  7. const int maxn=5e4+7;
  8. int f[maxn*3];
  9. int n,k,d,x,y;
  10. int get(int x){
  11. if(f[x]==x)return x;
  12. else return f[x]=get(f[x]);
  13. }
  14. int main(){
  15. scanf("%d%d",&n,&k);
  16. int ans=0;
  17. for(int i=1;i<=n;i++)
  18. f[i]=i;
  19. for(int i=0;i<k;i++){
  20. scanf("%d%d%d",&d,&x,&y);
  21. if(x>n||y>n){
  22. ans++;
  23. continue;
  24. }
  25. int fx_sel=get(x),fx_eat=get(x+n),fx_ene=get(x+n+n);
  26. int fy_sel=get(y),fy_eat=get(y+n),fy_ene=get(y+n+n);
  27. if(d==1){
  28. if(fx_sel==fy_eat||fx_sel==fy_ene){
  29. ans++;
  30. continue;
  31. }
  32. f[fy_sel]=fx_sel;
  33. f[fy_eat]=fx_eat;
  34. f[fy_ene]=fx_ene;
  35. }
  36. else if(d==2){
  37. if(fx_sel==fy_sel||fx_sel==fy_eat||x==y){
  38. ans++;
  39. continue;
  40. }
  41. f[fy_sel]=fx_eat;
  42. f[fy_ene]=fx_sel;
  43. f[fy_eat]=fx_ene;
  44. }
  45. }
  46. printf("%d\n",ans);
  47. return 0;
  48. }

转载于:https://www.cnblogs.com/helman/p/11233921.html

发表评论

表情:
评论列表 (有 0 条评论,382人围观)

还没有评论,来说两句吧...

相关阅读