[最小割] BZOJ 3144: [Hnoi2013]切糕
来源:互联网 发布:sql去除查询结果重复行 编辑:程序博客网 时间:2024/06/03 08:55
Solution
建立超级源汇,超级源连到切糕的顶部,切糕的底部连到超级汇,流量无穷大。
对于
如果不考虑
那么可以这么连。
如果选取的点不在区间
#include <bits/stdc++.h>using namespace std;const int N = 50;const int INF = 1 << 29;inline char get(void) { static char buf[100000], *S = buf, *T = buf; if (S == T) { T = (S = buf) + fread(buf, 1, 100000, stdin); if (S == T) return EOF; } return *S++;}template<typename T>inline void read(T &x) { static char c; x = 0; int sgn = 0; for (c = get(); c < '0' || c > '9'; c = get()) if (c == '-') sgn = 0; for (; c >= '0' && c <= '9'; c = get()) x = x * 10 + c - '0'; if (sgn) x = -x;}struct edge { int to, next, flow; edge(int t = 0, int n = 0, int f = 0):to(t), next(n), flow(f) {}};edge G[N * N * N * 10];int head[N * N * N], cur[N * N * N];int Gcnt, p, q, r, d, S, T, cnt, clc;int v[N][N][N], id[N][N][N];int dis[N * N * N], vis[N * N * N];queue<int> Q;inline void AddEdge(int from, int to, int flow) { G[++Gcnt] = edge(to, head[from], flow); head[from] = Gcnt; G[++Gcnt] = edge(from, head[to], 0); head[to] = Gcnt; // printf("%d %d %d\n", from, to, flow);}inline bool bfs(int S, int T) { vis[S] = ++clc; dis[S] = 0; Q.push(S); dis[T] = INF; while (!Q.empty()) { int u = Q.front(); Q.pop(); for (int i = head[u]; i; i = G[i].next) { edge &e = G[i]; if (e.flow && vis[e.to] != clc) { dis[e.to] = dis[u] + 1; Q.push(e.to); vis[e.to] = clc; } } } return dis[T] != INF;}inline int dfs(int u, int a) { if (u == T || !a) return a; int f, flow = 0; for (int &i = cur[u]; i; i = G[i].next) { edge &e = G[i]; if (dis[e.to] == dis[u] + 1 && e.flow && (f = dfs(e.to, min(e.flow, a))) > 0) { e.flow -= f; G[i ^ 1].flow += f; flow += f; a -= f; if (!a) break; } } return flow;}inline int MaxFlow(int S, int T) { int flow = 0; while (bfs(S, T)) { for (int i = 1; i <= T; i++) cur[i] = head[i]; flow += dfs(S, INF); } return flow;}int main(void) { Gcnt = 1; read(p); read(q); read(r); read(d); for (int i = 1; i <= r; i++) for (int j = 1; j <= p; j++) for (int k = 1; k <= q; k++) read(v[i][j][k]); for (int i = 0; i <= r; i++) for (int j = 1; j <= p; j++) for (int k = 1; k <= q; k++) id[i][j][k] = ++cnt; S = ++cnt; T = ++cnt; for (int j = 1; j <= p; j++) for (int k = 1; k <= q; k++) { AddEdge(S, id[0][j][k], INF); AddEdge(id[r][j][k], T, INF); for (int i = 1; i <= r; i++) { AddEdge(id[i - 1][j][k], id[i][j][k], v[i][j][k]); for (int x = -1; x <= 1; x++) for (int y = -1; y <= 1; y++) { if (!(x && !y) && !(y && !x)) continue; if (j + x < 1 || j + x > p) continue; if (k + y < 1 || k + y > q) continue; if (i > d) AddEdge(id[i][j][k], id[i - d][j + x][k + y], INF); } } } printf("%d\n", MaxFlow(S, T)); return 0;}
阅读全文
0 0
- bzoj 3144: [Hnoi2013]切糕(最小割)
- [BZOJ 3144][Hnoi2013]切糕(最小割)
- bzoj 3144: [Hnoi2013]切糕 最小割
- BZOJ 3144: [Hnoi2013]切糕 最小割
- [BZOJ]3144: [Hnoi2013]切糕 最小割
- [最小割] BZOJ 3144: [Hnoi2013]切糕
- 3144: [Hnoi2013]切糕 思路题 最小割
- 【bzoj3144】【HNOI2013】【切糕】【最小割】
- 【BZOJ3144】[Hnoi2013]切糕【最小割】
- [BZOJ3144][HNOI2013]切糕 最小割
- BZOJ 3144: [Hnoi2013]切糕
- 【BZOJ 3144】 [Hnoi2013]切糕
- BZOJ 3144 HNOI 2013 切糕 最小割
- bzoj 3144 切糕 最小割 解题报告
- bzoj3144: [Hnoi2013]切糕 DINIC最小割
- [BZOJ3144][Hnoi2013]切糕(最小割)
- [bzoj3144] [HNOI2013]切糕 网络流最小割
- [BZOJ3144][HNOI2013]切糕(最小割)
- DGUS II的网络应用
- ASP.NET Core远程调试
- 2017-11-28 clac 简易计算器
- Codeforces 898F Restoring the Expression [hash+枚举]
- Java线程池几个参数的理解
- [最小割] BZOJ 3144: [Hnoi2013]切糕
- 可组合性让OpenStack成为开源项目粘合剂
- 运算符 in
- [javase]插入排序
- 基础架构3.0:机器学习革命的基石
- sql如何巧妙用case语句做输出目标结果--蠢萌蠢萌
- bak
- Kibana的安装和使用
- execute