#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define loop(i,a,b) for(int i=a;i pii; typedef vector vi; typedef vector vvi; typedef vector vp; typedef vector vvp; typedef vector vs; typedef vector vd; typedef tuple tp; typedef vector vt; typedef vector vvd; typedef pair pip; typedef vectorvip; const double PI=acos(-1); const double EPS=1e-7; const int inf=1e8; const ll INF=1e16; int dx[]={0,1,0,-1}; int dy[]={1,0,-1,0}; struct edge{int to,cap,rev;};//ikisaki youryou gyakuhen class MF{//max flow public: int n; vector >G;//[MAX]; vectorused;//[MAX]; MF(int size){ n=size; G=vector >(n); } void add_edge(int from, int to, int cap){ edge q={to,cap,int(G[to].size())}; G[from].push_back(q); q={from,0,int(G[from].size()-1)}; G[to].push_back(q); } int dfs(int v,int t, int f) { if(v==t)return f; used[v]=1; for(int i=0;i0){ e.cap-=d; G[e.to][e.rev].cap+=d; return d; } } return 0; } int mf(int s,int t) {//from s to t,ford_fulkerson int flow=0,f; while(1){ used=vector(n,false); f=dfs(s,t,inf); if(f==0)return flow; flow+=f; } } }; int main(){ int n,m; cin>>n>>m; vs in(n); rep(i,n)cin>>in[i]; MF mf(2+n*m); rep(i,n)rep(j,m)if((i+j)%2==0)mf.add_edge(n*m,i*m+j,1); else mf.add_edge(i*m+j,n*m+1,1); rep(i,n)rep(j,m)if((i+j)%2==0&&in[i][j]!='.'){ rep(k,4){ int x=i+dx[k]; int y=j+dy[k]; if(x<0||y<0||x>=n||y>=m)continue; if(in[x][y]=='.')continue; mf.add_edge(i*m+j,x*m+y,1); } } int c=mf.mf(n*m,n*m+1); int coa=0,cob=0; rep(i,n)rep(j,m)if(in[i][j]=='w')coa++; else if(in[i][j]=='b')cob++; int out=c*100; coa-=c;cob-=c; out+=min(coa,cob)*10; out+=abs(coa-cob); cout<