题目链接

题意

有n次事件,q个队列,s个传感器。每个传感器接到一个队列,每个队列有一个容量。

接下来执行n次事件,每次事件都会有一个最大发送数据量d。和s个数据a,代表这次给每个s填入a的数据量。

每次事件执行完后都要将队列里面的数据发送总和为d的数据量。这一次事件的数据发送后队列剩余的数据可以给下一次事件用。问是否会有数据泄露(即给s填入的数据量能不能都发送出去)。

思路

最大流。

建图如下:

S->第i个事件的队列q1->第i个事件的队列q2->事件->T

第i个事件的队列q2->第i+1个事件的队列q1

容量:

S->第i个事件的所有队列q1 的容量为b,即输入给队列的数据量。

第i个事件的队列q1->第i个事件的队列q2->事件 和

第i个事件的队列q2->第i+1个事件的队列q1 的容量为c,即每个队列的最大容量。

事件->T 的容量为d,即每次可以放出去的数据量。

判断是否合法:∑b <= 最大流量。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 2150;
  4. const int INF = 0x3f3f3f3f;
  5. typedef long long LL;
  6. struct Edge {
  7. int u, v, nxt, cap;
  8. } edge[N*N*2];
  9. int head[N], tot, cur[N], gap[N], dis[N], pre[N], qq[N], cc[N];
  10. void Add(int u, int v, int cap) {
  11. edge[tot] = (Edge) { u, v, head[u], cap }; head[u] = tot++;
  12. edge[tot] = (Edge) { v, u, head[v], 0 }; head[v] = tot++;
  13. }
  14. int BFS(int S, int T) {
  15. queue<int> que; que.push(T);
  16. memset(dis, INF, sizeof(dis));
  17. memset(gap, 0, sizeof(gap));
  18. gap[0]++; dis[T] = 0;
  19. while(!que.empty()) {
  20. int u = que.front(); que.pop();
  21. for(int i = head[u]; ~i; i = edge[i].nxt) {
  22. int v = edge[i].v;
  23. if(dis[v] == INF) {
  24. dis[v] = dis[u] + 1;
  25. gap[dis[v]]++;
  26. que.push(v);
  27. }
  28. }
  29. }
  30. }
  31. int ISAP(int S, int T, int n) {
  32. BFS(S, T);
  33. memcpy(cur, head, sizeof(cur));
  34. int u = pre[S] = S, i, index, flow, ans = 0;
  35. while(dis[S] < n) {
  36. if(u == T) {
  37. flow = INF, index = S;
  38. for(i = S; i != T; i = edge[cur[i]].v)
  39. if(flow > edge[cur[i]].cap) flow = edge[cur[i]].cap, index = i;
  40. for(i = S; i != T; i = edge[cur[i]].v)
  41. edge[cur[i]].cap -= flow, edge[cur[i]^1].cap += flow;
  42. ans += flow, u = index;
  43. }
  44. for(i = cur[u]; ~i; i = edge[i].nxt)
  45. if(edge[i].cap > 0 && dis[edge[i].v] == dis[u] - 1) break;
  46. if(~i) {
  47. pre[edge[i].v] = u; cur[u] = i; u = edge[i].v;
  48. } else {
  49. if(--gap[dis[u]] == 0) break;
  50. int md = n;
  51. for(i = head[u]; ~i; i = edge[i].nxt)
  52. if(md > dis[edge[i].v] && edge[i].cap > 0) md = dis[edge[i].v], cur[u] = i;
  53. gap[dis[u] = md + 1]++;
  54. u = pre[u];
  55. }
  56. }
  57. return ans;
  58. }
  59. int main() {
  60. int n, q, s; scanf("%d%d%d", &n, &q, &s);
  61. memset(head, -1, sizeof(head)); tot = 0;
  62. int S = 0, T = n * q * 2 + n + 1;
  63. for(int i = 1; i <= s; i++) scanf("%d", &qq[i]);
  64. for(int i = 1; i <= q; i++) scanf("%d", &cc[i]);
  65. int sum = 0;
  66. for(int i = 1; i <= n; i++) {
  67. int d; scanf("%d", &d);
  68. Add(n * q * 2 + i, T, d); // 事件与汇点
  69. for(int j = 1; j <= s; j++) {
  70. int a; scanf("%d", &a); sum += a;
  71. Add(S, qq[j] + (i - 1) * q, a); // 源点与第一个队
  72. }
  73. for(int j = 1; j <= q; j++) {
  74. Add((i - 1) * q + j, (i - 1) * q + j + n * q, cc[j]); // 第一个队和第二个队
  75. Add((i - 1) * q + j + n * q, n * q * 2 + i, cc[j]); // 第二个队和事件
  76. if(i < n) Add((i - 1) * q + j + n * q, i * q + j, cc[j]); // 第二个队和下一个事件的第一个队
  77. }
  78. }
  79. // int ans = ISAP(S, T, T + 1);
  80. // printf("ans : %d\n", ans);
  81. if(sum <= ISAP(S, T, T + 1)) puts("possible");
  82. else puts("impossible");
  83. return 0;
  84. }

Codeforces Gym101170J:Jupiter Orbiter(最大流)的更多相关文章

  1. CodeForces 164C Machine Programming 费用流

    Machine Programming 题目连接: http://codeforces.com/problemset/problem/164/B Descriptionww.co One remark ...

  2. Codeforces.1045A.Last chance(最大流ISAP 线段树优化建图)

    题目链接 \(Description\) 你需要用给定的\(n\)个武器摧毁\(m\)架飞船中的某一些.每架飞船需要被摧毁恰好一次. 武器共三种:1.可以在给定的集合中摧毁一架飞船:2.可以摧毁区间\ ...

  3. codeforces gym 100357 I (费用流)

    题目大意 给出一个或与表达式,每个正变量和反变量最多出现一次,询问是否存在一种方案使得每个或式中有且仅有一个变量的值为1. 解题分析 将每个变量拆成三个点x,y,z. y表示对应的正变量,z表示对应的 ...

  4. CodeForces 1187G Gang Up 费用流

    题解: 先按时间轴将一个点拆成100个点. 第一个点相当于第一秒, 第二个点相当于第二秒. 在这些点之间连边, 每1流量的费用为c. 再将图上的边也拆开. 将 u_i 向 v_i+1 建边. 将 v_ ...

  5. Codeforces 708D 上下界费用流

    给你一个网络流的图 图中可能会有流量不平衡和流量>容量的情况存在 每调整一单位的流量/容量 需要一个单位的花费 问最少需要多少花费使得原图调整为正确(可行)的网络流 设当前边信息为(u,v,f, ...

  6. java 节点流(字符流,字节流)和包装流(缓冲流,转换流)

    结点流:直接对File类进行操作的文件流 package stream; import java.io.File; import java.io.FileNotFoundException; impo ...

  7. 2016-2017 ACM-ICPC Northwestern European Regional Programming Contest (NWERC 2016)

    A. Arranging Hat $f[i][j]$表示保证前$i$个数字有序,修改了$j$次时第$i$个数字的最小值. 时间复杂度$O(n^3m)$. #include <bits/stdc+ ...

  8. Codeforces Gym 100002 E "Evacuation Plan" 费用流

    "Evacuation Plan" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10 ...

  9. 【最大流】ECNA 2015 F Transportation Delegation (Codeforces GYM 100825)

    题目链接: http://codeforces.com/gym/100825 题目大意: N(N<=600)个点,每个点有个名字Si,R(R<=200)个生产商在R个点上,F(F<= ...

随机推荐

  1. win7(64bit)使用mingw64配置gtkmm

    因为linux命令不熟悉,加上时间不充裕,仍然决定在win7_64bit下开发GUI程序,选择gtkmm是因为: 1. 在图形界面程序中,windows系统当之无愧GUI之王,用户友好性其他OS无法替 ...

  2. 1-9 RHEL7-文件权限管理

    本节所讲内容: 文件的基本权限:r w x (UGO+ACL) 文件的高级权限:suid sgid sticky 第1章 文件的基本权限 1.1 权限的作用 通过对文件设定权限可以达到以下三种访问限制 ...

  3. jquery li练习2-恢复链条

    <!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  4. SQLSERVER 数据库备份脚本-支持多库备份

    原文:SQLSERVER 数据库备份脚本-支持多库备份 <pre name="code" class="sql">--变量定义 DECLARE @b ...

  5. mysql 的用户权限

    查看MySQL的用户权限 show grants for "username"@'host'; 添加新用户 允许本地IP访问localhost:127.0.0.1 use mysq ...

  6. 演练:创建和使用静态库 (C++)

    我们将创建的下一个库类型是静态库 (LIB). 使用静态库是重用代码的一种绝佳方式. 您不必在自己创建的每个程序中重新实现同一例程,而只需对这些例程编写一次,然后从需要该功能的应用程序引用它们即可. ...

  7. 深入windows的关机消息截获-从XP到Win7的变化(在XP中程序可以阻止关机,但是在Win7中程序无法阻止关机,可Block的时间从1秒调到了5秒) good

    之前写了一个软件用于实验室的打卡提醒,其中一个重要的功能是在关机之前提醒当天晚上是否已经打卡.之前我是在WM_ENDSESSION中弹出一个模态对话框来提醒,在XP中基本工作正常,在Win7中大多数时 ...

  8. 我的第一个Chrome插件:天气预报应用

    1.Chrome插件开发基础   开发Chrome插件很简单,只要会基本的前台技术HTML.CSS.JS就可以开发了. Chrome插件一般包括两个HTML页面background和popup.   ...

  9. c#编写的基于Socket的异步通信系统--SanNiuSignal.DLL已开源

    自从推出了SanNiuSignal.DLL,用户反映还是满好的;为了更好的服务于大家,我已经修复了很多BUG,同时把这个DLL开源;下面就先来介绍下 使用这个DLL开发出的简单的通信系统;如图: 想使 ...

  10. 教你如何在 Visual Studio 2013 上使用 Github

    介绍 我承认越是能将事情变简单的工具我越会更多地使用它.尽管我已经知道了足够的命令来使用Github,但我宁愿它被集成到IDE中.在本教程中,我会告诉你使用Visual Studio 2013如何实现 ...