結果
問題 | No.421 しろくろチョコレート |
ユーザー | hipokaba |
提出日時 | 2016-09-12 02:03:03 |
言語 | C++11 (gcc 11.4.0) |
結果 |
CE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 1,764 bytes |
コンパイル時間 | 626 ms |
コンパイル使用メモリ | 53,716 KB |
最終ジャッジ日時 | 2024-11-14 19:49:20 |
合計ジャッジ時間 | 1,211 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
コンパイルメッセージ
main.cpp:16:1: error: ‘vector’ does not name a type 16 | vector<E> g[2502]; | ^~~~~~ main.cpp: In function ‘void add_edge(int, int)’: main.cpp:24:9: error: ‘g’ was not declared in this scope 24 | g[f].push_back({t, 1, (int)g[t].size()}); | ^ main.cpp: In function ‘int dfs(int, int, int)’: main.cpp:64:19: error: ‘g’ was not declared in this scope 64 | for(E& e: g[v]){ | ^
ソースコード
#include <iostream> #include <algorithm> #define rep(i, n) for(int i = 0; i < (n); ++i) using namespace std; const int inf = 1e4; struct E{ int t, c, r; }; int n, m; string s[50]; vector<E> g[2502]; bool u[2502]; int encode(int i, int j){ return i * m + j; } void add_edge(int f, int t){ g[f].push_back({t, 1, (int)g[t].size()}); g[t].push_back({f, 0, (int)g[f].size() - 1}); } void make_graph(){ rep(i, n){ rep(j, m){ if(s[i][j] == 0){ add_edge(encode(n, 0) ,encode(i, j)); } else if(s[i][j] == 1){ add_edge(encode(i, j), encode(n, 1)); } if(i + 1 < n && s[i][j] + s[i + 1][j] == 1){ int p = encode(i, j), q = encode(i + 1, j); if(s[i][j] == 0){ add_edge(p, q); } else{ add_edge(q, p); } } if(j + 1 < m && s[i][j] + s[i][j + 1] == 1){ int p = encode(i, j), q = encode(i, j + 1); if(s[i][j] == 0){ add_edge(p, q); } else{ add_edge(q, p); } } } } } int dfs(int v, int t, int f){ if(v == t){ return f; } u[v] = true; for(E& e: g[v]){ if(!u[e.t] && e.c > 0){ int d = dfs(e.t, t, min(f, e.c)); if(d > 0){ e.c -= d; g[e.t][e.r].c += d; return d; } } } return 0; } int max_flow(int s, int t){ int mf = 0; while(1){ fill_n(u, n * m + 2, false); int f = dfs(s, t, inf); if(f == 0){ return mf; } mf += f; } } int main(){ cin >> n >> m; rep(i, n){ cin >> s[i]; rep(j, m){ s[i][j] = s[i][j] != '.' ? s[i][j] == 'w' : 2; } } make_graph(); int k = max_flow(encode(n, 0), encode(n, 1)); int b = -k, w = -k; rep(i, n){ rep(j, m){ if(s[i][j] == 0){ ++b; } else if(s[i][j] == 1){ ++w; } } } int l = min(b, w); cout << k * 100 + l * 10 + (b + w - 2 * l) << endl; return 0; }