BZOJ1458【最大流】

来源:互联网 发布:3d缩水软件 编辑:程序博客网 时间:2024/06/14 16:14
/* I will wait for you */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <algorithm>#include <iostream>#include <fstream>#include <vector>#include <queue>#include <deque>#include <set>#include <map>#include <string>#define make make_pair#define fi first#define se secondusing namespace std;typedef long long ll;typedef unsigned long long ull;typedef pair<int, int> pii;const int maxn = 210;const int maxm = 100010;const int maxs = 26;const int inf = 0x3f3f3f3f;const int P = 1000000007;const double error = 1e-9;inline int read(){int x = 0, f = 1;char ch = getchar();while (ch < '0' || ch > '9')  f = (ch == '-' ? -1 : 1), ch = getchar();while (ch >= '0' && ch <= '9')   x = x * 10 + ch - '0', ch = getchar();return x * f;}struct edge {int v, a, next;} e[maxm];int n, m, k, s, t, cnt, ans, head[maxm], cur[maxn], q[maxn], dis[maxn], up[maxn], down[maxn], in[maxn][maxn];void insert(int u, int v, int a) {e[cnt] = (edge) {v, a, head[u]};head[u] = cnt++;e[cnt] = (edge) {u, 0, head[v]};head[v] = cnt++;}bool bfs(){for(int i = 1; i <= t; i++)dis[i] = -1;int fir = 0, last = 1;q[fir] = s, dis[s] = 0;while (fir != last) {int u = q[fir++];for (int i = head[u]; i != -1; i = e[i].next) {int v = e[i].v;if (e[i].a && dis[v] == -1) {dis[v] = dis[u] + 1;q[last++] = v;}}}return dis[t] != -1;}int dfs(int u, int a){if (u == t) return a;int f, flow = 0;for (int i = cur[u]; a&& i != -1; i = e[i].next) {int v= e[i].v;if(e[i].a && dis[v] == dis[u] + 1) {f = dfs(v, min(a, e[i]. a));e[i].a -= f, e[i^1].a +=f;a -=f, flow += f;if (e[i].a) cur[u] = i;}}if (!flow) dis[u] = -1;return flow;}void dinic(){while (bfs()) {for (int i = 1; i <= t; i++)cur[i] = head[i];ans += dfs(s, inf);}}int main(){m = read(), n = read(), k = read();for (int i = 1; i <= m; i++)down[i] = read(), up[i] = n; for (int i = 1; i <= n; i++)down[m + i] = read(), up[m + i] = m;for (int i = 1; i <= k; i++) {int x = read(), y = read();in[x][y] = 1;up[x]--, up[m + y]--; }s = m + n + 1, t = m + n + 2; memset(head, -1, sizeof head);for (int i = 1; i <= m; i++)insert(s, i, up[i] - down[i]);for (int i = 1; i <= n; i++)insert(m + i, t, up[m + i] - down[m + i]);for (int i = 1; i <= m; i++)for (int j = 1; j <= n; j++)if (!in[i][j])insert(i, m + j, 1);dinic();printf("%d\n", m * n - k -ans);return 0;}

0 0
原创粉丝点击