嘟嘟嘟

最小割。

不过割掉边代表付出某一种代价,而题中让求的是利润。所以我们先把完成所有任务的总利润加起来,然后算没有完成任务付出的代价。

建图比较明白:

1.源点向任务连一条边,容量为完成这个任务赚到的钱。割掉代表这个任务没完成。

2.每一个机器向汇点连一条边,容量为买这个机器所花的钱。割掉代表没买这个机器。

3.每一个任务向完成这个任务要用到的机器连边,容量为租用该机器所花的钱。

图大概是这样的:

比如完成这一个任务需要三个机器。

我们考虑最小割有哪几种情况:

1.x < min(a, d) + min(b, e) + min(c, f)。那么割掉(x)边,就是说完成这个任务得到的钱太少了,亏本,那就放弃算了。

2.对于每一个机器,x >= min(a, d) + min(b, e) + min(c, f)。说明完成这个任务能赚点钱,那就完成吧。

代码:

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cmath>
  4 #include<algorithm>
  5 #include<cstring>
  6 #include<cstdlib>
  7 #include<cctype>
  8 #include<vector>
  9 #include<stack>
 10 #include<queue>
 11 using namespace std;
 12 #define enter puts("")
 13 #define space putchar(' ')
 14 #define Mem(a, x) memset(a, x, sizeof(a))
 15 #define rg register
 16 typedef long long ll;
 17 typedef double db;
 18 const int INF = 0x3f3f3f3f;
 19 const db eps = 1e-8;
 20 const int maxn = 2.5e3 + 5;
 21 inline ll read()
 22 {
 23     ll ans = 0;
 24     char ch = getchar(), last = ' ';
 25     while(!isdigit(ch)) {last = ch; ch = getchar();}
 26     while(isdigit(ch)) {ans = ans * 10 + ch - '0'; ch = getchar();}
 27     if(last == '-') ans = -ans;
 28     return ans;
 29 }
 30 inline void write(ll x)
 31 {
 32     if(x < 0) x = -x, putchar('-');
 33     if(x >= 10) write(x / 10);
 34     putchar(x % 10 + '0');
 35 }
 36
 37 int n, m, t;
 38 int sum = 0;
 39
 40 struct Edge
 41 {
 42     int from, to, cap, flow;
 43 };
 44 vector<Edge> edges;
 45 vector<int> G[maxn];
 46 void addEdge(int from, int to, int w)
 47 {
 48     edges.push_back((Edge){from, to, w, 0});
 49     edges.push_back((Edge){to, from, 0, 0});
 50     int sz = edges.size();
 51     G[from].push_back(sz - 2);
 52     G[to].push_back(sz - 1);
 53 }
 54
 55 int dis[maxn];
 56 bool bfs()
 57 {
 58     Mem(dis, 0); dis[0] = 1;
 59     queue<int> q; q.push(0);
 60     while(!q.empty())
 61     {
 62         int now = q.front(); q.pop();
 63         for(int i = 0; i < (int)G[now].size(); ++i)
 64         {
 65             Edge& e = edges[G[now][i]];
 66             if(!dis[e.to] && e.cap > e.flow)
 67             {
 68                 dis[e.to] = dis[now] + 1;
 69                 q.push(e.to);
 70             }
 71         }
 72     }
 73     return dis[t];
 74 }
 75 int cur[maxn];
 76 int dfs(int now, int res)
 77 {
 78     if(now == t || res == 0) return res;
 79     int flow = 0, f;
 80     for(int& i = cur[now]; i < (int)G[now].size(); ++i)
 81     {
 82         Edge& e = edges[G[now][i]];
 83         if(dis[e.to] == dis[now] + 1 && (f = dfs(e.to, min(res, e.cap - e.flow))) > 0)
 84         {
 85             e.flow += f;
 86             edges[G[now][i] ^ 1].flow -= f;
 87             flow += f; res -= f;
 88             if(res == 0) break;
 89         }
 90     }
 91     return flow;
 92 }
 93
 94 int minCut()
 95 {
 96     int flow = 0;
 97     while(bfs())
 98     {
 99         Mem(cur, 0);
100         flow += dfs(0, INF);
101     }
102     return flow;
103 }
104
105 int main()
106 {
107     n = read(); m = read();
108     t = n + m + 1;
109     for(int i = 1; i <= n; ++i)
110     {
111         int x = read(), d = read();
112         sum += x; addEdge(0, i, x);
113         for(int j = 1; j <= d; ++j)
114         {
115             int y = read(), w = read();
116             addEdge(i, n + y, w);
117         }
118     }
119     for(int i = 1; i <= m; ++i)
120     {
121         int w = read();
122         addEdge(n + i, t, w);
123     }
124     write(sum - minCut()); enter;
125     return 0;
126 }

View Code

转载于:https://www.cnblogs.com/mrclr/p/9696871.html

[CEOI2008]order相关推荐

  1. Bzoj 1391: [Ceoi2008]order 网络流,最大权闭合图

    1391: [Ceoi2008]order Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1105  Solved: 331 [Submit][Sta ...

  2. BZOJ1391: [Ceoi2008]order

    [传送门:BZOJ1391] 简要题意: 有n个工作,m种机器,每种机器可以租或买来,给出租和买的费用,每个工作有若干个工序,每个工序需要用某种机器完成,完成工作可以获得利润 求出完成n个工作的最大利 ...

  3. [CEOI2008] order

    题目描述 有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完成. 现在给出这些参数,求最大利润 输入输出格式 输入格式 ...

  4. P4177 [CEOI2008]order

    传送门 答案等于总工作价值减去最小失去的价值 考虑构建最小割模型 在 $S$割 的点表示选,在 $T$割 的点表示不选 对于机器(编号从 $n+1$ 到 $n+m$) $n+i$,连边 $(n+i,T ...

  5. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

  6. 107. Binary Tree Level Order Traversal II

    题目 Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from l ...

  7. 102. Binary Tree Level Order Traversal

    题目 Binary Tree Level Order Traversal 层次遍历二叉树 链接 Given a binary tree, return the level order traversa ...

  8. Mysql分页order by数据错乱重复

    公司用的是Mybatis,发现分页和排序时直接传递参数占位符用的都是 ,由于,由于,由于有SQL注入风险,要改为#,但是封装page类又麻烦,所以直接使用了 pageHelper 插件了,方便快捷,但 ...

  9. select 和 order by

    select 的优先级要高于order by,相当于是select先创建了一个临时表,再通过临时表去排序.所以,对于一些sum()的汇总,在进行排序,实际是排序的select后的字段,而不是表里的那个 ...

  10. access order by 判断是否除数为0

    order by IIF(dz>0,yj/dz,0) desc 转载于:https://www.cnblogs.com/slyzly/p/5379482.html

最新文章

  1. html5保存资源本地,html5之Localstorage本地存储
  2. 开发js插件之所遇--02[DOM]
  3. 阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第1节 继承_6_继承中方法的覆盖重写_概念...
  4. 字段 新增hive_Hive分区表 | 每日五分钟学大数据
  5. 敏捷需求分析及深度提升(广州 2014.1.11)
  6. uniapp图片自适应_uni-app下input组件基于内容自适应宽度的实现
  7. NLP简报(Issue#9)
  8. cstringw转lpctstr_CString 和 LPCTSTR 之间的转换 及 LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR的区分与转化...
  9. sht20中写用户寄存器_SHT20最新数字温湿度传感器芯片 程序
  10. Android学习系列(33)--App应用之提交到各大市场渠道
  11. Context-free grammar 与 BNF,ASN.1
  12. ocp12c认证通过
  13. 使用D触发器完成带有异步清零clrn和同步使能wen的8位寄存器
  14. 神经网络理论及应用答案,神经网络理论名词解释
  15. utf-8的中文是一个字符占几个字
  16. 【ai·ps·word字体问题】
  17. 一分二功率分配器_三种一分三路等功率分配器的性能比较
  18. 联想 小新 Pro 16 2022 锐龙版评测
  19. JAVAMVC的时鲜蔬菜配送系统计算机毕业设计Mybatis+系统+数据库+调试部署
  20. iOS 全景播放器最简单的解决方案

热门文章

  1. c# 获取路径的盘符_C# IO操作之 如何玩转路径
  2. 分布有限传输速度高的计算机网络,第5章 计算机网络基础.ppt
  3. mysql+instr查询,mysql中使用instr进行模糊查询方法介绍
  4. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_04-项目概述-技术栈和开发步骤...
  5. 阶段3 2.Spring_03.Spring的 IOC 和 DI_11 set方法注入
  6. 页面三个txt加载联动省市县的代码,类似淘宝的收货地址的布局
  7. 汇编实验 三 编程、编译、连接、跟踪
  8. O365 打开或关闭脚本功能
  9. autofac获取全局Container
  10. 3.2 GUN as汇编(本文内容大部分引用原文,非原创)