[CEOI2008]order
嘟嘟嘟
最小割。
不过割掉边代表付出某一种代价,而题中让求的是利润。所以我们先把完成所有任务的总利润加起来,然后算没有完成任务付出的代价。
建图比较明白:
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相关推荐
- Bzoj 1391: [Ceoi2008]order 网络流,最大权闭合图
1391: [Ceoi2008]order Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1105 Solved: 331 [Submit][Sta ...
- BZOJ1391: [Ceoi2008]order
[传送门:BZOJ1391] 简要题意: 有n个工作,m种机器,每种机器可以租或买来,给出租和买的费用,每个工作有若干个工序,每个工序需要用某种机器完成,完成工作可以获得利润 求出完成n个工作的最大利 ...
- [CEOI2008] order
题目描述 有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完成. 现在给出这些参数,求最大利润 输入输出格式 输入格式 ...
- P4177 [CEOI2008]order
传送门 答案等于总工作价值减去最小失去的价值 考虑构建最小割模型 在 $S$割 的点表示选,在 $T$割 的点表示不选 对于机器(编号从 $n+1$ 到 $n+m$) $n+i$,连边 $(n+i,T ...
- [颓废史]蒟蒻的刷题记录
QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...
- 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 ...
- 102. Binary Tree Level Order Traversal
题目 Binary Tree Level Order Traversal 层次遍历二叉树 链接 Given a binary tree, return the level order traversa ...
- Mysql分页order by数据错乱重复
公司用的是Mybatis,发现分页和排序时直接传递参数占位符用的都是 ,由于,由于,由于有SQL注入风险,要改为#,但是封装page类又麻烦,所以直接使用了 pageHelper 插件了,方便快捷,但 ...
- select 和 order by
select 的优先级要高于order by,相当于是select先创建了一个临时表,再通过临时表去排序.所以,对于一些sum()的汇总,在进行排序,实际是排序的select后的字段,而不是表里的那个 ...
- access order by 判断是否除数为0
order by IIF(dz>0,yj/dz,0) desc 转载于:https://www.cnblogs.com/slyzly/p/5379482.html
最新文章
- html5保存资源本地,html5之Localstorage本地存储
- 开发js插件之所遇--02[DOM]
- 阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第1节 继承_6_继承中方法的覆盖重写_概念...
- 字段 新增hive_Hive分区表 | 每日五分钟学大数据
- 敏捷需求分析及深度提升(广州 2014.1.11)
- uniapp图片自适应_uni-app下input组件基于内容自适应宽度的实现
- NLP简报(Issue#9)
- cstringw转lpctstr_CString 和 LPCTSTR 之间的转换 及 LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR的区分与转化...
- sht20中写用户寄存器_SHT20最新数字温湿度传感器芯片 程序
- Android学习系列(33)--App应用之提交到各大市场渠道
- Context-free grammar 与 BNF,ASN.1
- ocp12c认证通过
- 使用D触发器完成带有异步清零clrn和同步使能wen的8位寄存器
- 神经网络理论及应用答案,神经网络理论名词解释
- utf-8的中文是一个字符占几个字
- 【ai·ps·word字体问题】
- 一分二功率分配器_三种一分三路等功率分配器的性能比较
- 联想 小新 Pro 16 2022 锐龙版评测
- JAVAMVC的时鲜蔬菜配送系统计算机毕业设计Mybatis+系统+数据库+调试部署
- iOS 全景播放器最简单的解决方案
热门文章
- c# 获取路径的盘符_C# IO操作之 如何玩转路径
- 分布有限传输速度高的计算机网络,第5章 计算机网络基础.ppt
- mysql+instr查询,mysql中使用instr进行模糊查询方法介绍
- 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_04-项目概述-技术栈和开发步骤...
- 阶段3 2.Spring_03.Spring的 IOC 和 DI_11 set方法注入
- 页面三个txt加载联动省市县的代码,类似淘宝的收货地址的布局
- 汇编实验 三 编程、编译、连接、跟踪
- O365 打开或关闭脚本功能
- autofac获取全局Container
- 3.2 GUN as汇编(本文内容大部分引用原文,非原创)