题目链接

题意

N个机关每个机关有开启时间和触发时间,同时每个机关还需要一定数量的M种元素来触发。元素由一个洞口向外输送,移动速度1m/s1m/s1m/s,对于一些无法直接到达的机关,女王可以提供KKK次机会来直接触发这些机关,问触发所有的机关最少需要多少元素。

思路

  • 无解的情况
    如果无法直接触发的机关数量大于KKK
  • 最小数量元素
    因为元素可以相互转移即元素可以公用,我们尽可能的让多的元素重复使用。
    元素的种类小于5,可以分开求解。
  1. 对于每个机关拆成两个点,一个用来接受元素(B),一个用向外输送元素(B)。
  2. 源点到(A),流量为该机关需要的该元素的数量,费用为1,表示必须从起点得到的元素,无法公用的元素
  3. (A)到汇点,流量为该机关需要的该元素的数量,费用为0,表示最终满足条件的元素转移
  4. 源点到(B),流量为该机关需要的该元素的数量,费用为0,表示可以用来公用转移的元素数量(应为每个机关需要的元素必须全部满足才能触发)
  5. 判断(B)能向那些机关进行转移,流量为infinfinf,费用0,实际用来公用转移的元素

这样相当与能公用元素的机关先触发,之后统计那些必须从源点得到的元素的数量。

#include <bits/stdc++.h>
#define LL long long
#define P pair<int, int>
#define lowbit(x) (x & -x)
#define mem(a, b) memset(a, b, sizeof(a))
#define mid ((l + r) >> 1)
#define lc rt<<1
#define rc rt<<1|1
#define endl '\n'
const int maxn = 3e2 + 1;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
using namespace std;
int path[maxn], dis[maxn], head[maxn];
bool vis[maxn];
int n, m, k, cnt;
struct ac{int v, c, cost, pre;
}edge[maxn*32];
void addedge(int u, int v, int c, int cost) {edge[cnt].v = v;edge[cnt].c = c;edge[cnt].cost = cost;edge[cnt].pre = head[u];head[u] = cnt++;
}
bool spfa (int s, int e) {mem(vis, false);mem(dis, inf);mem(path, -1);queue<int> que;que.push(s);dis[s] = 0;vis[s] = true;while (!que.empty()) {int u = que.front();que.pop();vis[u] = false;for (int i = head[u]; i != -1; i = edge[i].pre) {int v = edge[i].v;int c = edge[i].c;int cost = edge[i].cost;if (dis[v] > dis[u] + cost && c > 0) {dis[v] = dis[u] + cost;path[v] = i;if (!vis[v]) {vis[v] = true;que.push(v);}}}}if (dis[e] == inf) return false;else return true;
}int MincostMaxflow(int s, int e, int &cost) {int maxflow = 0;int flow = inf;while (spfa(s, e)) {for (int i = path[e]; i != -1; i = path[edge[i^1].v])flow = min(flow, edge[i].c);for (int i = path[e]; i != -1; i = path[edge[i^1].v]) {edge[i].c -= flow;edge[i^1].c += flow;cost += flow * edge[i].cost;}maxflow += flow;}return maxflow;
}struct ac2{int x, y, start, stop;int num[7];
}a[maxn];
int Dis(int x, int y, int s, int e) {return abs(x - s) + abs(y - e);
}int main () {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n, m, k;int sx, sy;scanf("%d%d%d%d%d", &n, &m, &k, &sx, &sy);for (int i = 1; i < n; ++i) {scanf("%d%d%d%d", &a[i].x, &a[i].y, &a[i].start, &a[i].stop);for (int j = 1; j <= m; ++j) {scanf("%d", &a[i].num[j]);}}// judgefor (int i = 1; i < n; ++i) {if (Dis(sx, sy, a[i].x, a[i].y) > a[i].start) k--;}if (k < 0) {puts("THE END IS COMING!!!!!");return 0;}n--;int s = 0, e = 2 * n + 1;int ans = 0;for (int i = 1; i <= m; ++i) {mem(head, -1);cnt = 0;for (int j = 1; j <= n; ++j) {if (Dis(sx, sy, a[j].x, a[j].y) > a[j].start) continue;// acceptaddedge(s, j, a[j].num[i], 1);addedge(j, s, 0, -1);// totaddedge(j, e, a[j].num[i], 0);addedge(e, j, 0, 0);// sendaddedge(s, n+j, a[j].num[i], 0);addedge(n+j, s, 0, 0);for (int k = 1; k <= n; ++k) {if (k == j) continue;if (Dis(a[j].x, a[j].y, a[k].x, a[k].y) + a[j].stop + a[j].start <= a[k].start) {addedge(j+n, k, inf, 0);addedge(k, j+n, 0, 0);}}}MincostMaxflow(s, e, ans);}printf("%d\n", ans);return 0;
}

zzuli 2527: THE END IS COMING!!!!!(最小费用最大流)相关推荐

  1. zzuli 2527: THE END IS COMING!!!!!//最小费用最大流

    zzuli 2527: THE END IS COMING!!!!!//最小费用最大流 时间限制: 1 Sec  内存限制: 256 MB 提交: 24  解决: 7 [提交] [状态] [讨论版] ...

  2. 乌鲁木齐网络赛J题(最小费用最大流模板)

    ACM ICPC 乌鲁木齐网络赛 J. Our Journey of Dalian Ends 2017-09-09 17:24 243人阅读 评论(0) 收藏 举报  分类: 网络流(33)  版权声 ...

  3. POJ - 2516 Minimum Cost 最小费用最大流

    题目链接 题意:给n,m,k表示商店数,储存店数,种类数 然后给n*k表示每个水果店需求每种种类的数量: 表示成 need[i][j] 再给m*k表示每个储存店每种种类数量: 表示成store[i][ ...

  4. pku The Windy's KM最小权匹配 or 最小费用最大流

    http://poj.org/problem?id=3686 题意: 给定n个玩具,有m个车间,给出每个玩具在每个车间的加工所需的时间mat[i][j]表示第i个玩具在第j个车间加工所需的时间,规顶只 ...

  5. c语言最小费用流_策略算法工程师之路-图优化算法(一)(二分图amp;最小费用最大流)...

    目录 1.图的基本定义 2.双边匹配问题 2.1 二分图基本概念 2.2 二分图最大匹配求解 2.3 二分图最优匹配求解 2.4 二分图最优匹配建模实例 2.4.1 二分图最优匹配在师生匹配中的应用 ...

  6. 有源汇上下界最小费用可行流 ---- P4553 80人环游世界(拆点 + 有源汇上下界最小费用可行流)

    题目链接 题目大意: 解题思路: 又是一道裸题 . 首先它要求第iii个点只经过ViViVi那么我们就拆点ai,ai+na_i,a_{i+n}ai​,ai+n​一个点为入点,一个为出点这条边的流量范围 ...

  7. 有源汇上下界最小费用可行流 ---- P4043 [AHOI2014/JSOI2014]支线剧情(模板)

    题目链接 题目大意: 解题思路: 有源汇上下界最小费用可行流模板题目来着 先建出一个有源汇上下界可行流的图,然后注意建图的时候要把每条边的下界的费用提前加到ans里面 然后再对图跑费用流,就是补齐费用 ...

  8. Doctor NiGONiGO’s multi-core CPU(最小费用最大流模板)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=693 题意:有一个 k 核的处理器和 n 个工作,全部的工作都须要在一个核上处理一个单位的 ...

  9. 【最小费用最大流】Going Home

    概念: 在同一个网络中,可能存在多个总流量相同的最大流,我们可以在计算流量的基础之上,给网络中的弧增加一个单位流量的费用(简称费用),在确保流量最大的前提下总费用最小--最小费用最大流. C - Go ...

  10. 最大流最小费用java_最小费用最大流及算法

    最大流的网络,可看作为辅送一般货物的运输网络,此时,最大流问题仅表明运输网络运输货物的能力,但没有考虑运送货物的费用.在实际问题中,运送同样数量货物的运输方案可能有多个,因此从中找一个输出费用最小的的 ...

最新文章

  1. 第二百二十节,jQuery EasyUI,Slider(滑动条)组件
  2. 为何我的BLOG不能DIY?
  3. eplan接触器主触点怎么成一组_实物讲解接触器自锁电路的接线方法
  4. 《编程原本 》一2.1 变换
  5. 全球及中国工业水性涂料行业销售前景与竞争态势研究报告2022年
  6. PyCharm编程环境的中英文字体分别设置的好处多----一石三鸟地解决中文字体不一致、英文字体不涵盖中文字符、编程字体实用性兼顾美观性的三个问题
  7. fastdfs的tracker启动之后一直选举_jraft选举策略
  8. java 线程“生产/消费”模型1
  9. 前端学习(1544):MVC的组成部分2
  10. [bzoj4881][Lydsy2017年5月月赛]线段游戏
  11. php长按图片保存mui,Vue+mui实现图片的本地缓存
  12. Leetcode201. Bitwise AND of Numbers Range数字范围按位与
  13. 数据结构-02-链表数据结构之双链表和循环链表
  14. 关于PostThreadMessage以及创建线程消息队列
  15. 【细胞分割】基于matlab分水岭算法细胞分割计数【含Matlab源码 639期】
  16. aoa计算机二级考试答案操作题,浙江省计算机二级等级考试aoa理论题.pdf
  17. 如何用word制作自己想要的硬笔字帖
  18. 小学计算机flash,小学信息技术flash课件
  19. 办公室学什么计算机,(计算机)办公室文员、助理都可以学学,留着迟早用得着
  20. Python遥感影像拼接

热门文章

  1. python中的functools模块
  2. 字符输出流写文本文件【Writer、FileWriter 、BufferedReader 】
  3. 通用权限管理系统组件 (GPM - General Permissions Manager) 中及时通讯功能的改进
  4. 去除U盘插入后自动弹框的问题
  5. Server.UrlEncode、HttpUtility.UrlDecode不同编码
  6. 在ubuntu下安装memcache
  7. C# 数据库存储过程的讲解应用
  8. 【数据结构与算法】之深入解析“打家劫舍II”的求解思路与算法示例
  9. 127. Word Ladder 单词接龙
  10. 做人工智能必看的 45 篇论文,附下载地址 | 文末有彩蛋