結果
問題 | No.421 しろくろチョコレート |
ユーザー | はまやんはまやん |
提出日時 | 2016-09-10 10:29:06 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 4 ms / 2,000 ms |
コード長 | 2,318 bytes |
コンパイル時間 | 2,152 ms |
コンパイル使用メモリ | 184,816 KB |
実行使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2024-09-23 07:08:17 |
合計ジャッジ時間 | 3,594 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,812 KB |
testcase_01 | AC | 3 ms
6,948 KB |
testcase_02 | AC | 2 ms
6,940 KB |
testcase_03 | AC | 2 ms
6,944 KB |
testcase_04 | AC | 2 ms
6,940 KB |
testcase_05 | AC | 2 ms
6,940 KB |
testcase_06 | AC | 2 ms
6,944 KB |
testcase_07 | AC | 2 ms
6,944 KB |
testcase_08 | AC | 3 ms
6,944 KB |
testcase_09 | AC | 2 ms
6,944 KB |
testcase_10 | AC | 2 ms
6,940 KB |
testcase_11 | AC | 3 ms
6,944 KB |
testcase_12 | AC | 2 ms
6,940 KB |
testcase_13 | AC | 2 ms
6,944 KB |
testcase_14 | AC | 2 ms
6,944 KB |
testcase_15 | AC | 2 ms
6,940 KB |
testcase_16 | AC | 4 ms
6,940 KB |
testcase_17 | AC | 3 ms
6,944 KB |
testcase_18 | AC | 4 ms
6,940 KB |
testcase_19 | AC | 2 ms
6,944 KB |
testcase_20 | AC | 3 ms
6,944 KB |
testcase_21 | AC | 3 ms
6,940 KB |
testcase_22 | AC | 2 ms
6,944 KB |
testcase_23 | AC | 2 ms
6,944 KB |
testcase_24 | AC | 2 ms
6,940 KB |
testcase_25 | AC | 2 ms
6,944 KB |
testcase_26 | AC | 2 ms
6,944 KB |
testcase_27 | AC | 2 ms
6,940 KB |
testcase_28 | AC | 2 ms
6,944 KB |
testcase_29 | AC | 2 ms
6,944 KB |
testcase_30 | AC | 2 ms
6,944 KB |
testcase_31 | AC | 3 ms
6,944 KB |
testcase_32 | AC | 2 ms
6,940 KB |
testcase_33 | AC | 3 ms
6,944 KB |
testcase_34 | AC | 2 ms
6,944 KB |
testcase_35 | AC | 2 ms
6,940 KB |
testcase_36 | AC | 2 ms
6,940 KB |
testcase_37 | AC | 3 ms
6,944 KB |
testcase_38 | AC | 4 ms
6,944 KB |
testcase_39 | AC | 2 ms
6,940 KB |
testcase_40 | AC | 3 ms
6,944 KB |
testcase_41 | AC | 2 ms
6,944 KB |
testcase_42 | AC | 2 ms
6,940 KB |
testcase_43 | AC | 2 ms
6,940 KB |
testcase_44 | AC | 2 ms
6,944 KB |
testcase_45 | AC | 2 ms
6,944 KB |
testcase_46 | AC | 2 ms
6,944 KB |
testcase_47 | AC | 2 ms
6,944 KB |
testcase_48 | AC | 3 ms
6,944 KB |
testcase_49 | AC | 2 ms
6,940 KB |
testcase_50 | AC | 2 ms
6,940 KB |
testcase_51 | AC | 3 ms
6,944 KB |
testcase_52 | AC | 2 ms
6,940 KB |
testcase_53 | AC | 2 ms
6,940 KB |
testcase_54 | AC | 3 ms
6,944 KB |
testcase_55 | AC | 2 ms
6,940 KB |
testcase_56 | AC | 2 ms
6,940 KB |
testcase_57 | AC | 2 ms
6,940 KB |
testcase_58 | AC | 2 ms
6,944 KB |
testcase_59 | AC | 2 ms
6,944 KB |
testcase_60 | AC | 4 ms
6,940 KB |
testcase_61 | AC | 3 ms
6,940 KB |
testcase_62 | AC | 2 ms
6,944 KB |
testcase_63 | AC | 2 ms
6,944 KB |
testcase_64 | AC | 2 ms
6,940 KB |
ソースコード
#include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=a;i<b;i++) #define INF INT_MAX/2 struct Maxflow { struct edge { int to, cap, rev; edge(int t, int c, int r) { to = t; cap = c; rev = r; } }; int V; vector<vector<edge>> G; vector<int> itr, level; Maxflow(int V) : V(V) { G.assign(V, vector<edge>()); } void add_edge(int from, int to, int cap) { G[from].push_back(edge(to, cap, (int)G[to].size())); G[to].push_back(edge(from, 0, (int)G[from].size() - 1)); } void bfs(int s) { level.assign(V, -1); queue<int> q; level[s] = 0; q.push(s); while (!q.empty()) { int v = q.front(); q.pop(); for (auto &e : G[v]) { if (e.cap > 0 and level[e.to] < 0) { level[e.to] = level[v] + 1; q.push(e.to); } } } } int dfs(int v, int t, int f) { if (v == t) return f; for (int& i = itr[v]; i < (int)G[v].size(); ++i) { edge& e = G[v][i]; if (e.cap > 0 and level[v] < level[e.to]) { int d = dfs(e.to, t, min(f, e.cap)); if (d > 0) { e.cap -= d; G[e.to][e.rev].cap += d; return d; } } } return 0; } int run(int s, int t) { int ret = 0, f; while (bfs(s), level[t] >= 0) { itr.assign(V, 0); while ((f = dfs(s, t, INF)) > 0) ret += f; } return ret; } }; //----------------------------------------------------------------- int N, M; string S[50]; int idx[50][50]; int dx[2] = { 1, 0 }; int dy[2] = { 0, 1 }; //----------------------------------------------------------------- int main() { cin >> N >> M; rep(i, 0, N) cin >> S[i]; int b = 0, w = 0; rep(y, 0, N) rep(x, 0, M) { if (S[y][x] == 'w') idx[y][x] = w, w++; else if (S[y][x] == 'b') idx[y][x] = b, b++; } Maxflow mf(1 + w + b + 1); rep(i, 0, w) mf.add_edge(0, i + 1, 1); rep(y, 0, N) rep(x, 0, M) if(S[y][x] != '.') rep(i, 0, 2) { int yy = y + dy[i]; int xx = x + dx[i]; if (yy < 0 || N <= yy) continue; if (xx < 0 || M <= xx) continue; if (S[yy][xx] == '.') continue; int bb = (S[y][x] == 'b' ? idx[y][x] : idx[yy][xx]); int ww = (S[y][x] == 'b' ? idx[yy][xx] : idx[y][x]); mf.add_edge(ww + 1, bb + 1 + w, 1); } rep(i, 0, b) mf.add_edge(1 + w + i, 1 + w + b, 1); int m = mf.run(0, 1 + w + b); int ans = 0; ans += m * 100; ans += min(b - m, w - m) * 10; ans += abs(b - w); cout << ans << endl; }