您的位置:首页 > 其它

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}

构图即可。

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: