結果
| 問題 |
No.421 しろくろチョコレート
|
| コンテスト | |
| ユーザー |
Yazaten
|
| 提出日時 | 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 2500
vector<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;
}
Yazaten