結果
問題 | No.421 しろくろチョコレート |
ユーザー |
![]() |
提出日時 | 2019-02-14 15:59:51 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 9 ms / 2,000 ms |
コード長 | 2,167 bytes |
コンパイル時間 | 1,345 ms |
コンパイル使用メモリ | 163,556 KB |
実行使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2024-09-23 07:22:40 |
合計ジャッジ時間 | 2,923 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 65 |
ソースコード
#include <bits/stdc++.h>using namespace std;#ifdef LOCAL#define eprintf(...) fprintf(stderr, __VA_ARGS__)#else#define eprintf(...) 42#endif#define rep(i,n) for(int i=0;i<(int)(n);i++)#define repi(i,a,b) for(int i=(int)(a);i<(int)(b);i++)#define all(x) (x).begin(),(x).end()#define foreach(u,v) for(auto (u) : (v))#define pb push_back#define mp make_pair#define mt make_tupletypedef long long ll;typedef pair<int, int> pii;typedef vector<int> vi;typedef vector<vi> vvi;typedef pair<ll, ll> pll;typedef vector<ll> vl;const int inf = 1e9;const ll linf = 1LL<<60;const ll mod = 1e9 + 7;const double eps = 1e-9;/**/struct edge{int to, cap, rev;edge(int t, int c, int r){to = t; cap = c; rev = r;}};int n, m;string c[50];vector<edge> g[2510];bool used[2510];void add_edge(int from, int to, int cap){g[from].pb(edge(to, cap, g[to].size()));g[to].pb(edge(from, 0, g[from].size()-1));}int dfs(int v, int t, int f){if(v == t) return f;used[v] = true;for(auto& e : g[v]){if(e.cap > 0 and !used[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 maxflow(int s, int t){int flow = 0;while(1){fill(used, used+n*m, false);int f = dfs(s, t, inf);if(f == 0) return flow;flow += f;}}int main(){cin >> n >> m;rep(i, n) cin >> c[i];int s = n * m;int t = s + 1;int nw = 0, nb = 0;rep(i, n) rep(j, m){if(c[i][j] == 'w'){add_edge(s, m*i+j, 1);nw++;}else if(c[i][j] == 'b'){add_edge(m*i+j, t, 1);nb++;}}int dx[] = {1, -1, 0, 0};int dy[] = {0, 0, 1, -1};rep(i, n) rep(j, m){if(c[i][j] == 'w'){rep(k, 4){int nx = j + dx[k];int ny = i + dy[k];if(nx < 0 or m <= nx or ny < 0 or n <= ny) continue;if(c[ny][nx] == 'b'){add_edge(m*i+j, m*ny+nx, 1);}}}}int max_f = maxflow(s, t);int ten = min(nw-=max_f, nb-=max_f);cout << 100*max_f+10*ten+(nw+nb-ten*2) << endl;return 0;}