結果
問題 | No.421 しろくろチョコレート |
ユーザー |
|
提出日時 | 2019-03-11 22:26:39 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 62 ms / 2,000 ms |
コード長 | 2,488 bytes |
コンパイル時間 | 639 ms |
コンパイル使用メモリ | 74,340 KB |
実行使用メモリ | 28,120 KB |
最終ジャッジ日時 | 2024-09-23 07:22:45 |
合計ジャッジ時間 | 3,932 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 65 |
ソースコード
#include <iostream>#include <vector>#include <algorithm>#include <string>#include <cctype>#include <functional>#include <map>#include <cstring>using namespace std;typedef long long ll;#define reps(i,s,n) for(int (i) = (s); (i) < (n); (i)++)#define rep(i,n) reps(i,0,n)const int INF = 1e9;struct edge {int to,cap,rev;};const int MAX_V = 1e6;vector<edge> G[MAX_V];bool used[MAX_V];void add_edge(int from,int to,int cap){G[from].push_back({to,cap,(int)G[to].size()});G[to].push_back({from,0,(int)G[from].size()-1});}int dfs(int v,int t,int f){if(v==t) return f;used[v] = true;rep(i,G[v].size()){edge &e = G[v][i];if(!used[e.to] && e.cap > 0){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 max_flow(int s,int t){int flow = 0;for(;;){memset(used,0,sizeof(used));int f = dfs(s,t,INF);if(f == 0) return flow;flow += f;}}int V,E;int f,to,c;int N,M;vector<string> vec;int main(){int B=0,W=0;cin >> N >> M;vec.resize(N);rep(i,N) cin >> vec[i];rep(i,N){rep(j,M){if(vec[i][j] == 'w'){add_edge(10000,i*M+j ,1);W++;}else if(vec[i][j]=='b'){add_edge(i*M+j,10001,1);B++;}}}rep(i,N) {rep(j,M){if(vec[i][j] == 'w'){if(i > 0){if(vec[i-1][j] == 'b'){add_edge(i*M+j,(i-1)*M+j ,1);}}if(i < N-1){if(vec[i+1][j] == 'b'){add_edge(i*M+j,(i+1)*M+j ,1);}}if(j > 0){if(vec[i][j-1] == 'b'){add_edge(i*M+j,i*M+j-1,1);}}if(j < M-1){if(vec[i][j+1] == 'b'){add_edge(i*M+j, i*M+j+1,1);}}}}}int total_f = max_flow(10000,10001);int ans = total_f*100;ans += min(B-total_f, W-total_f)*10;ans += (max(B-total_f, W-total_f) - min(B-total_f, W-total_f) );cout << ans << endl;return 0;}