結果
問題 | No.421 しろくろチョコレート |
ユーザー |
![]() |
提出日時 | 2016-09-22 21:07:26 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 6 ms / 2,000 ms |
コード長 | 1,662 bytes |
コンパイル時間 | 1,668 ms |
コンパイル使用メモリ | 163,536 KB |
実行使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2024-09-23 07:09:34 |
合計ジャッジ時間 | 3,185 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 65 |
ソースコード
#include "bits/stdc++.h"using namespace std;typedef long long ll;typedef pair<int,int> pii;#define rep(i,n) for(ll i=0;i<(ll)(n);i++)#define all(a) (a).begin(),(a).end()#define pb push_back#define INF (1e9+1)//#define INF (1LL<<59)//2部最大マッチング verified AOJ GRL_7_A#define MAX_V 2500vector<int> G[MAX_V];int match[MAX_V];bool used[MAX_V];void add_edge(int u,int v){G[u].pb(v);G[v].pb(u);}// 増大路をDFSで探すbool dfs(int v){used[v]=true;rep(i,G[v].size()){int u=G[v][i],w=match[u]; //u:vからの移動先の頂点 , w:uとマッチングしている頂点if(w<0 || (!used[w] && dfs(w))){ //uがフリーか、このdfsではwを使っておらず かつwの別のペアが見つかった(=増大路発見) 場合match[v]=u;match[u]=v;return true;}}return false;}int bipartite_matching(int V){int res=0;rep(i,MAX_V)match[i]=-1;rep(v,V){if(match[v]<0){rep(i,MAX_V)used[i]=0;if( dfs(v) ) res++; //増大路が見つかればres+=1}}return res;}int main(){int h,w;cin>>h>>w;vector<string> vs(h);rep(i,h)cin>>vs[i];int white=0,black=0;rep(i,h)rep(j,w){if(vs[i][j]=='w')white++;if(vs[i][j]=='b')black++;}rep(i,h){rep(j,w){if(vs[i][j]=='b'){int dy[]={1,0,-1,0};int dx[]={0,1,0,-1};rep(k,4){int ddy = i+dy[k];int ddx = j+dx[k];if( ddx>=0 && ddy>=0 && ddx<w && ddy<h &&vs[ddy][ddx]=='w' ){add_edge(i*w+j,ddy*w+ddx);}}}}}int res = bipartite_matching(h*w);white -= res;black -= res;cout<<res*100+min(white,black)*10+abs(white-black)<<endl;}