結果
問題 | No.957 植林 |
ユーザー | Mister |
提出日時 | 2020-11-04 09:01:47 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 561 ms / 2,000 ms |
コード長 | 3,684 bytes |
コンパイル時間 | 1,206 ms |
コンパイル使用メモリ | 98,940 KB |
実行使用メモリ | 15,456 KB |
最終ジャッジ日時 | 2024-07-22 09:48:44 |
合計ジャッジ時間 | 15,808 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,812 KB |
testcase_01 | AC | 2 ms
6,940 KB |
testcase_02 | AC | 2 ms
6,940 KB |
testcase_03 | AC | 62 ms
14,028 KB |
testcase_04 | AC | 54 ms
14,304 KB |
testcase_05 | AC | 60 ms
14,496 KB |
testcase_06 | AC | 62 ms
14,248 KB |
testcase_07 | AC | 69 ms
14,732 KB |
testcase_08 | AC | 35 ms
14,168 KB |
testcase_09 | AC | 31 ms
13,772 KB |
testcase_10 | AC | 39 ms
14,056 KB |
testcase_11 | AC | 37 ms
13,668 KB |
testcase_12 | AC | 37 ms
13,644 KB |
testcase_13 | AC | 26 ms
14,708 KB |
testcase_14 | AC | 32 ms
14,196 KB |
testcase_15 | AC | 33 ms
14,712 KB |
testcase_16 | AC | 27 ms
13,552 KB |
testcase_17 | AC | 29 ms
13,900 KB |
testcase_18 | AC | 386 ms
15,144 KB |
testcase_19 | AC | 412 ms
14,948 KB |
testcase_20 | AC | 416 ms
13,908 KB |
testcase_21 | AC | 457 ms
13,720 KB |
testcase_22 | AC | 473 ms
13,936 KB |
testcase_23 | AC | 493 ms
13,924 KB |
testcase_24 | AC | 547 ms
14,220 KB |
testcase_25 | AC | 561 ms
14,364 KB |
testcase_26 | AC | 553 ms
14,888 KB |
testcase_27 | AC | 550 ms
13,948 KB |
testcase_28 | AC | 533 ms
15,456 KB |
testcase_29 | AC | 537 ms
14,568 KB |
testcase_30 | AC | 539 ms
14,380 KB |
testcase_31 | AC | 385 ms
14,000 KB |
testcase_32 | AC | 403 ms
14,728 KB |
testcase_33 | AC | 424 ms
14,908 KB |
testcase_34 | AC | 463 ms
13,868 KB |
testcase_35 | AC | 478 ms
13,656 KB |
testcase_36 | AC | 518 ms
14,904 KB |
testcase_37 | AC | 512 ms
14,480 KB |
testcase_38 | AC | 524 ms
13,968 KB |
testcase_39 | AC | 510 ms
13,992 KB |
testcase_40 | AC | 504 ms
14,244 KB |
testcase_41 | AC | 19 ms
13,760 KB |
testcase_42 | AC | 19 ms
14,164 KB |
testcase_43 | AC | 26 ms
15,152 KB |
testcase_44 | AC | 25 ms
13,924 KB |
testcase_45 | AC | 2 ms
6,944 KB |
testcase_46 | AC | 2 ms
6,940 KB |
testcase_47 | AC | 2 ms
6,940 KB |
ソースコード
#include <iostream> #include <algorithm> #include <vector> #include <queue> #include <limits> template <class T> std::vector<T> vec(int len, T elem) { return std::vector<T>(len, elem); } template <class Cap, bool isDirect> struct MaxFlow { struct Edge { int src, dst; Cap cap; Edge(int src, int dst, Cap cap) : src(src), dst(dst), cap(cap){}; }; std::vector<Edge> edges; std::vector<std::vector<int>> graph; std::vector<int> dist, iter; explicit MaxFlow(int n) : graph(n), dist(n), iter(n) {} void span(int u, int v, Cap cap) { graph[u].push_back(edges.size()); edges.emplace_back(u, v, cap); graph[v].push_back(edges.size()); edges.emplace_back(v, u, (isDirect ? 0 : cap)); } void bfs(int s) { std::fill(dist.begin(), dist.end(), -1); dist[s] = 0; std::queue<int> que; que.push(s); while (!que.empty()) { auto v = que.front(); que.pop(); for (auto eidx : graph[v]) { const auto& edge = edges[eidx]; if (edge.cap > 0 && dist[edge.dst] == -1) { dist[edge.dst] = dist[v] + 1; que.push(edge.dst); } } } } Cap dfs(int v, int g, Cap f) { if (v == g) return f; for (auto& itr = iter[v]; itr < (int)graph[v].size(); ++itr) { auto eidx = graph[v][itr]; auto& edge = edges[eidx]; if (edge.cap > 0 && dist[v] < dist[edge.dst]) { auto df = dfs(edge.dst, g, std::min(f, edge.cap)); if (df > 0) { edge.cap -= df; auto& redge = edges[eidx ^ 1]; redge.cap += df; return df; } } } return 0; } Cap flow(int s, int g) { const Cap INF = std::numeric_limits<Cap>::max(); Cap ret = 0; while (true) { bfs(s); if (dist[g] < 0) return ret; std::fill(iter.begin(), iter.end(), 0); while (true) { Cap f = dfs(s, g, INF); if (f == 0) break; ret += f; } } } }; using lint = long long; void solve() { int h, w; std::cin >> h >> w; auto gss = vec(h, vec(w, 0LL)); lint gsum = 0; std::vector<lint> grsum(h, 0), gcsum(w, 0); for (int i = 0; i < h; ++i) { for (int j = 0; j < w; ++j) { auto& g = gss[i][j]; std::cin >> g; g *= 2; gsum += g; grsum[i] += g; gcsum[j] += g; } } std::vector<lint> rs(h), cs(w); for (auto& r : rs) { std::cin >> r; r *= 2; } for (auto& c : cs) { std::cin >> c; c *= 2; } lint gain = gsum; for (auto r : rs) gain += r; for (auto c : cs) gain += c; int s = h + w, g = s + 1; MaxFlow<lint, true> mf(h + w + 2); for (int i = 0; i < h; ++i) { mf.span(s, i, grsum[i] / 2 + rs[i]); mf.span(i, g, grsum[i]); } for (int j = 0; j < w; ++j) { mf.span(s, j + h, gcsum[j] / 2 + cs[j]); mf.span(j + h, g, gcsum[j]); } for (int i = 0; i < h; ++i) { for (int j = 0; j < w; ++j) { mf.span(i, j + h, gss[i][j] / 2); mf.span(j + h, i, gss[i][j] / 2); } } auto cost = mf.flow(s, g); std::cout << (gain - cost) / 2 << "\n"; } int main() { std::cin.tie(nullptr); std::ios::sync_with_stdio(false); solve(); return 0; }