经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
LOJ#505. 「LibreOJ β Round」ZQC 的游戏(最大流)
来源:cnblogs  作者:自为风月马前卒  时间:2019/1/28 9:45:36  对本文有异议

题意

题目链接

Sol

首先把第一个人能吃掉的食物删掉

然后对每个人预处理出能吃到的食物,直接限流跑最大流就行了

判断一下最后的最大流是否等于重量和

注意一个非常恶心的地方是需要把除1外所有人都吃不到的食物删掉

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 1e6 + 10, INF = 1e9 + 10;
  4. int sqr(int x) {return x * x;}
  5. inline int read() {
  6. char c = getchar(); int x = 0, f = 1;
  7. while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
  8. while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  9. return x * f;
  10. }
  11. int N, M, S, T, deep[MAXN], cur[MAXN], vis[MAXN];
  12. struct Edge {
  13. int u, v, f, nxt;
  14. }E[MAXN];
  15. int head[MAXN], num;
  16. void add_edge(int x, int y, int f) {E[num] = (Edge) {x, y, f, head[x]}; head[x] = num++;}
  17. inline void AddEdge(int x, int y, int f) {add_edge(x, y, f); add_edge(y, x, 0);}
  18. int x[MAXN], y[MAXN], w[MAXN], r[MAXN], fx[MAXN], fy[MAXN], fw[MAXN], flag[MAXN];
  19. void init() {
  20. S = 0; T = 233333; num = 0;
  21. memset(vis, 0, sizeof(vis));
  22. memset(head, -1, sizeof(head));
  23. memset(flag, 0, sizeof(flag));
  24. }
  25. bool check(int a, int b) {return (sqr(x[a] - fx[b]) + sqr(y[a] - fy[b]) <= sqr(r[a]));}
  26. bool BFS() {
  27. queue<int>q; q.push(S);
  28. memset(deep, 0, sizeof(deep));
  29. deep[S] = 1;
  30. while(q.size() != 0) {
  31. int p = q.front(); q.pop();
  32. for(int i = head[p]; i != -1; i = E[i].nxt) {
  33. if(E[i].f && !deep[E[i].v]) {
  34. deep[E[i].v] = deep[p] + 1;
  35. if(E[i].v == T) return deep[T];
  36. q.push(E[i].v);
  37. }
  38. }
  39. }
  40. return deep[T];
  41. }
  42. int DFS(int x, int flow) {
  43. if(x == T) return flow;
  44. int ansflow = 0;
  45. for(int &i = cur[x]; i != -1; i = E[i].nxt) {
  46. if(deep[E[i].v] == deep[x] + 1 && E[i].f) {
  47. int canflow = DFS(E[i].v, min(E[i].f, flow));
  48. flow -= canflow;
  49. E[i].f -= canflow; E[i ^ 1].f += canflow;
  50. ansflow += canflow;
  51. if(flow <= 0) break;
  52. }
  53. }
  54. return ansflow;
  55. }
  56. int Dinic() {
  57. int ans = 0;
  58. while(BFS()) {
  59. memcpy(cur, head, sizeof(head));
  60. ans += DFS(S, INF);
  61. }
  62. return ans;
  63. }
  64. void solve() {
  65. init();
  66. N = read(); M = read();
  67. for(int i = 1; i <= N; i++) x[i] = read(), y[i] = read(), w[i] = read(), r[i] = read();
  68. for(int i = 1; i <= M; i++) fx[i] = read(), fy[i] = read(), fw[i] = read();
  69. int Lim = w[1], ned = 0;
  70. for(int i = 1; i <= M; i++)
  71. if(check(1, i)) Lim += fw[i], flag[i] = 1;
  72. else ned += fw[i];
  73. for(int i = 2; i <= N; i++) {
  74. AddEdge(S, i, Lim - w[i]);///还能再吃这些食物
  75. if(Lim - w[i] <= 0) {puts("qaq"); return ;}
  76. for(int j = 1; j <= M; j++)
  77. if(!flag[j] && check(i, j)) AddEdge(i, j + N, INF), vis[j] = 1;
  78. }
  79. for(int i = 1; i <= M; i++) {
  80. if(!flag[i]) AddEdge(i + N, T, fw[i]);
  81. if(!vis[i]) ned -= fw[i];//谁都吃不到
  82. }
  83. puts(Dinic() >= ned ? "ZQC! ZQC!" : "qaq");
  84. }
  85. signed main() {
  86. for(int T = read(); T; T--, solve());
  87. return 0;
  88. }
  89. /*
  90. 2
  91. 3 2
  92. 0 0 1 10
  93. 10 0 1 10
  94. 20 0 1 10
  95. 5 0 2
  96. 15 0 4
  97. 3 2
  98. 0 0 1 10
  99. 10 0 1 10
  100. 20 0 1 10
  101. 5 0 2
  102. 15 0 5
  103. */

原文链接:http://www.cnblogs.com/zwfymqz/p/10320771.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号