BZOJ 1391|CEOI 2008|Order|最小割
2016-04-20 16:28
423 查看
令ti=0表示执行任务i,xi=0表示购买机器i,xi=1表示租机器i或啥也不干。
然后答案有:
max{∑max{0,1−ti}⋅Ti−∑max{0,xj−ti}⋅di,j−∑max{0,1−xj}⋅aj}
表示ti=0时有收入Ti,此时如果xj=1,那么就收租金di,j,否则算购买费用aj。
ti=1时,对于要使用的机器xj无论取什么值都与xi无关。
变换得:
∑Ti−min{∑max{0,ti}⋅Ti+∑max{0,xj−ti}⋅di,j+∑max{0,1−xj}⋅aj}
构图即可。
Sample Input
然后答案有:
max{∑max{0,1−ti}⋅Ti−∑max{0,xj−ti}⋅di,j−∑max{0,1−xj}⋅aj}
表示ti=0时有收入Ti,此时如果xj=1,那么就收租金di,j,否则算购买费用aj。
ti=1时,对于要使用的机器xj无论取什么值都与xi无关。
变换得:
∑Ti−min{∑max{0,ti}⋅Ti+∑max{0,xj−ti}⋅di,j+∑max{0,1−xj}⋅aj}
构图即可。
#include <cstdio> #define FOR(i,j,k) for(i=j;i<=k;++i) #define min(i,j) ((i)<(j)?(i):(j)) const int inf = 0x3f3f3f3f, N = 2405, M = 3000005; int level , cnt = 1, cur , v[M], p[M], h , q[M], s = 0, t, w[M]; void add(int a, int b, int c) { p[++cnt] = h[a]; v[cnt] = b; w[cnt] = c; h[a] = cnt; p[++cnt] = h[b]; v[cnt] = a; w[cnt] = 0; h[b] = cnt; } bool bfs() { int f = 0, r = 0, u, i; for (i = s; i <= t; ++i) level[i] = -1; q[r++] = s; level[s] = 1; while (f < r) { u = q[f++]; for (i = h[u]; i; i = p[i]) { if (w[i] && level[v[i]] == -1) { level[v[i]] = level[u] + 1; q[r++] = v[i]; } } } return level[t] > 0; } int dfs(int u, int low) { int i, tmp = 0, res = 0; if (u == t) return low; for (i = cur[u]; i && res < low; i = p[i]) { if (w[i] && level[v[i]] == level[u] + 1) { tmp = dfs(v[i], min(w[i], low - res)); w[i] -= tmp; w[i ^ 1] += tmp; res += tmp; if (w[i]) cur[u] = i; } } if (!res) level[u] = -1; return res; } int dinic() { int ans = 0, i; while (bfs()) { for (i = s; i <= t; ++i) cur[i] = h[i]; ans += dfs(s, inf); } return ans; } int main() { int i, a, b, c, d, n, m, ans = 0; scanf("%d%d", &n, &m); t = n + m + 1; for (i = 1; i <= n; ++i) { scanf("%d%d", &a, &b); add(s, i, a); ans += a; while (b--) { scanf("%d%d", &c, &d); add(i, n + c, d); } } for (i = 1; i <= m; ++i) { scanf("%d", &a); add(n + i, t, a); } printf("%d", ans - dinic()); return 0; }
1391: [Ceoi2008]order
Description
有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完成。 现在给出这些参数,求最大利润Input
第一行给出 N,M(1<=N<=1200,1<=M<=1200) 下面将有N块数据,每块数据第一行给出完成这个任务能赚到的钱(其在[1,5000])及有多少道工序 接下来若干行每行两个数,分别描述完成工序所需要的机器编号及租用它的费用(其在[1,20000]) 最后M行,每行给出购买机器的费用(其在[1,20000])Output
最大利润Sample Input
2 3 100 2 1 30 2 20 100 2 1 40 3 80 50 80 110
Sample Output
50相关文章推荐
- FreeMarker整合Spring 3
- Docker run执行流详解(以volume,network和libcontainer为线索)
- 搜索1001
- H3C 虚拟化
- Linux怎么添加用户成为sudoers
- append(function(index, html)),clone(true)和clone()的区别
- PHP正则表达式及实例
- 戴尔+微软混合云应用:从容灾备份到多云管理
- CodeForces 615A Bulbs
- mysql复制表结构,表数据
- 2016Android某公司面试题
- SQL查表关键字使用简介
- 安全意识培养
- LAMP学习路线图
- Java 发送Get和Post请求
- 个人工作总结3
- 数据库对比
- 2016年度 JavaScript 展望(上)
- 生产环境下戴尔 R820 kvm虚拟化部署一(centos6.6 kvm物理机安装)
- ubuntu源码安装postgresql(问题解决)转载