結果
問題 | No.421 しろくろチョコレート |
ユーザー |
![]() |
提出日時 | 2016-09-16 20:35:06 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 11 ms / 2,000 ms |
コード長 | 1,956 bytes |
コンパイル時間 | 874 ms |
コンパイル使用メモリ | 86,624 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-09-23 07:08:32 |
合計ジャッジ時間 | 2,458 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 65 |
ソースコード
#include <iostream>#include <vector>#include <map>#include <set>#include <queue>#include <algorithm>#include <iomanip>#include <cassert>using namespace std;#define GET_ARG(a,b,c,F,...) F#define REP3(i,s,e) for (i = s; i <= e; i++)#define REP2(i,n) REP3 (i,0,(int)(n)-1)#define REP(...) GET_ARG (__VA_ARGS__,REP3,REP2) (__VA_ARGS__)#define RREP3(i,s,e) for (i = s; i >= e; i--)#define RREP2(i,n) RREP3 (i,(int)(n)-1,0)#define RREP(...) GET_ARG (__VA_ARGS__,RREP3,RREP2) (__VA_ARGS__)#define DEBUG(x) cerr << #x ": " << x << endlstruct Edge {int to;int cap;int rev;};string s[50];vector<Edge> e[2502];bool used[2502];int dx[] = {0,1,0,-1};int dy[] = {1,0,-1,0};void add_edge(int a, int b) {e[a].push_back({b,1,(int)e[b].size()});e[b].push_back({a,0,(int)e[a].size()-1});}int dfs(int v, int t, int f) {if (v == t) return f;used[v] = true;for (auto& x: e[v]) if (!used[x.to] && x.cap) {int d = dfs(x.to,t,min(f,x.cap));if (d > 0) {x.cap -= d;e[x.to][x.rev].cap += d;return d;}}return 0;}int main(void) {int i, j, k, n, m;cin >> n >> m;REP (i,n) cin >> s[i];int w = 0, b = 0;REP (i,n) REP (j,m) {if (s[i][j] == 'w') {add_edge(n*m,i*m+j);REP (k,4) {int ni = i + dx[k];int nj = j + dy[k];if (ni < 0 || ni >= n || nj < 0 || nj >= m) continue;add_edge(i*m+j,ni*m+nj);}w++;}else if (s[i][j] == 'b') {add_edge(i*m+j,n*m+1);b++;}}int ans = 0;for (;;) {REP (i,n*m+2) used[i] = false;int f = dfs(n*m,n*m+1,1);if (f == 0) break;ans += 100;w--; b--;}ans += min(w,b) * 10;ans += max(w,b) - min(w,b);cout << ans << endl;return 0;}