当前位置:   article > 正文

NOIP2017提高组D2T1[奶酪]_noip2017 提高组 d2t1

noip2017 提高组 d2t1

题意:

一个长宽无限的立方体中有一些空洞,相交或者相接的空洞可以互相到达,跟立方体下表面相交或相切的空洞可以从下表面到达,上表面同理,问是否可以从下表面到达上表面。

题解:

建图之后floodfill,注意建图可能爆long long或者double的精度问题。

代码:

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <cstdlib>
  6. #include <ctime>
  7. using namespace std;
  8. const int MAXN = 1005;
  9. const int MAXM = 1002005;
  10. struct Edge
  11. {
  12. int to;
  13. int next;
  14. }edge[MAXM << 1];
  15. int T,n,id;
  16. int first[MAXN];
  17. long long r,h;
  18. long long x[MAXN];
  19. long long y[MAXN];
  20. long long z[MAXN];
  21. bool mark[MAXN];
  22. void addE(int u,int v)
  23. {
  24. edge[++id] = (Edge){v,first[u]};
  25. first[u] = id;
  26. }
  27. bool dfs(int now)
  28. {
  29. if (now == n + 1)
  30. return true;
  31. if (mark[now])
  32. return false;
  33. mark[now] = true;
  34. for (int i = first[now];i;i = edge[i].next)
  35. if (dfs(edge[i].to))
  36. return true;
  37. return false;
  38. }
  39. int main()
  40. {
  41. freopen("cheese.in","r",stdin);
  42. freopen("cheese.out","w",stdout);
  43. ios::sync_with_stdio(false);
  44. cin >> T;
  45. while (T--)
  46. {
  47. memset(first,0,sizeof(first));
  48. memset(mark,0,sizeof(mark));
  49. id = 0;
  50. cin >> n >> h >> r;
  51. for (int i = 1;i <= n;i++)
  52. {
  53. cin >> x[i] >> y[i] >> z[i];
  54. if (z[i] < 0)
  55. while(1){}
  56. if (z[i] <= r)
  57. addE(0,i),addE(i,0);
  58. if (h - z[i] <= r)
  59. addE(n + 1,i),addE(i,n + 1);
  60. }
  61. r *= 2;
  62. for (int i = 1;i <= n;i++)
  63. for (int j = 1;j <= n;j++)
  64. if (i != j && (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]) <= r * r - (z[i] - z[j]) * (z[i] - z[j]))
  65. addE(i,j),addE(j,i);
  66. cout << (dfs(0) ? "Yes" : "No") << endl;
  67. }
  68. return 0;
  69. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/792410
推荐阅读
  

闽ICP备14008679号