记录编号 510296 评测结果 AAAAAAAAAA
题目名称 [NOI 2001]食物链 最终得分 100
用户昵称 Gravatarleon 是否通过 通过
代码语言 C++ 运行时间 0.089 s
提交时间 2018-09-18 21:32:26 内存使用 1.08 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<algorithm>
  3. #include<stdio.h>
  4. #define maxn (50005)
  5. using namespace std;
  6. int n,m,fa[4*maxn],ans;
  7. void init()
  8. {
  9. for (int i=1;i<=4*n;i++)
  10. fa[i]=i;
  11. }
  12. int find(int x)
  13. {
  14. if (fa[x]==x) return fa[x];
  15. return fa[x]=find(fa[x]);
  16. }
  17. void unio(int x,int y)
  18. {
  19. fa[find(x)]=find(y);
  20. return ;
  21. }
  22. int pan1(int x,int y)//判断  x与y是同类  是否是真话
  23. {
  24. if (x>n || y>n || x<=0 ||y<=0) return 0;
  25. if (find(x+n)==find(y) || find(x+2*n)==find(y)) return 0;
  26. //如果 x所吃的东西与y是同类 或 吃x的东西与y是同类,返回0(假话)
  27. return 1;
  28. }
  29. int pan2(int x,int y)//判断  x吃y  是否是真话
  30. {
  31. if (x>n || y>n || x<=0 ||y<=0 || x==y) return 0;
  32. if (find(x)==find(y) || find(x+2*n)==find(y)) return 0;
  33. //x与y是同类,或,y与吃x的东西是同类,则返回0(是假话)
  34. return 1;
  35. }
  36. int main()
  37. {
  38. freopen("eat.in","r",stdin);
  39. freopen("eat.out","w",stdout);
  40. scanf("%d%d",&n,&m);
  41. init();ans=0;
  42. for (int i=1;i<=m;i++)
  43. {
  44. int p,x,y;
  45. scanf("%d%d%d",&p,&x,&y);
  46. if (p==1)
  47. {
  48. if (pan1(x,y))
  49. {
  50. //要注意同时将三个集合全部重合
  51. unio(x,y);
  52. unio(x+n,y+n);
  53. unio(x+2*n,y+2*n);
  54. }
  55. else
  56. ans++;
  57. }
  58. else
  59. {
  60. if (pan2(x,y))
  61. {
  62. unio(x+n,y);//y与x吃的东西连接
  63. unio(x+2*n,y+n);//y吃的东西与吃x的东西连接
  64. unio(x,y+2*n);//x与吃y的东西连接
  65. }
  66. else
  67. ans++;
  68. }
  69. }
  70. printf("%d\n",ans);
  71. }