POJ - 3281 Dining 最大流,拆点,超级源汇
发布日期:2021-05-10 11:28:34 浏览次数:22 分类:精选文章

本文共 2786 字,大约阅读时间需要 9 分钟。

���������������������������������������n������m���������k���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

���������������������������������������������������������������������������������������������������������in���out������������������������������������������������������������������in���������������out������������������������������������������������������������������������������������������������in���������������������������in������������������������������������������������������������������

���������������Dinic���������������������������������������������������������������������������������������������������in���out���������������������������������������������������������������������������������

#include 
#include
#include
#include
#include
#include
#include
using namespace std; const int INF = 0x3f3f3f3f; const int MAXN = 10100; const int MAXE = 200010; int head[MAXN]; int cnt = 0; int maxflow = 0; struct Edge { int v, w, next; }; void init() { memset(head, -1, sizeof(head)); cnt = 0; maxflow = 0; } void add(int u, int v, int w) { edge[cnt].v = v; edge[cnt].w = w; edge[cnt].next = head[u]; head[u] = cnt++; } bool bfs() { queue
q; int depth[MAXN]; int now[MAXN]; fill(depth.begin(), depth.end(), INF); depth[s] = 0; q.push(s); now[s] = head[s]; while (q.size()) { int u = q.front(); q.pop(); for (int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].v; if (edge[i].w > 0 && depth[v] == INF) { depth[v] = depth[u] + 1; now[v] = head[v]; q.push(v); if (v == t) return true; } } } return false; } ll dfs(int u, ll flow) { if (u == t) return flow; int ans = 0; int i = now[u]; while (i != -1) { int v = edge[i].v; if (depth[v] == depth[u] + 1 && edge[i].w > 0) { ans += min(flow, edge[i].w); edge[i].w -= min(flow, edge[i].w); if (v == t) { flow -= min(flow, edge[i].w); ans *= 100; // ������������ } i = edge[i].next; } } if (ans > 0) { maxflow += ans; } return ans; } void dinic() { while (bfs()) { ll f = dfs(s, INF); if (f == 0) break; } } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, m, k; init(); s = 2 * n + m + k + 1; t = s + 1; for (int i = 1; i <= n; ++i) { int a, b; cin >> a >> b; for (; a--; a >= 0; a--) { int x = 2 * n + 2 * a; add(x, i, 1); add(i, x, 0); } for (; b--; b >= 0; b--) { int x = 2 * n + m + 2 * b; add(x, i + n, 1); add(i + n, x, 0); } add(i, i + n, 1); add(i + n, i, 0); } for (int i = 1; i <= m; ++i) { add(s, 2 * n + 2 * i - 1, 1); } for (int i = 1; i <= k; ++i) { int x = 2 * n + m + 2 * i; add(x, t, 1); add(t, x, 0); } dinic(); cout << maxflow; }
上一篇:POJ - 1087 A Plug for UNIX 最大流 超级源汇
下一篇:POJ - 3436 ACM Computer Factory 最大流,拆点,输出路径,dinic

发表评论

最新留言

不错!
[***.144.177.141]2025年03月31日 22时09分32秒