#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define ll long long #define ld long double #define EPS 0.0000000001 #define INF 1e9 #define LINF (ll)INF*INF #define MOD 1000000007 #define rep(i,n) for(int i=0;i<(n);i++) #define loop(i,a,n) for(int i=a;i<(n);i++) #define all(in) in.begin(),in.end() #define shosu(x) fixed< vi; typedef vector vs; typedef pair pii; typedef vector vp; int gcd(int a, int b){ if(b==0) return a; return gcd(b,a%b); } int lcm(int a, int b){ return a*b/gcd(a,b); } //ford-fulkerson //O(FE) #define MAX_V 10000 struct edge{ int to,cap,rev;}; vector G[MAX_V]; bool used[MAX_V]; void add_edge(int from, int to, int cap){ G[from].push_back((edge){to,cap,G[to].size()}); G[to].push_back((edge){from,0,G[from].size()-1}); } int dfs(int v, int t, int f){ if(v == t)return f; used[v] = true; for(int i = 0; i < G[v].size(); i++){ 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; while(1){ memset(used,0,sizeof(used)); int f = dfs(s, t, INF); if(f == 0)return flow; flow += f; } } signed main(void) { int n,m; cin >> n >> m; vs s(n); rep(i,n)cin >> s[i]; int w = 0, b = 0; int dx[] = {0,1,0,-1}; int dy[] = {1,0,-1,0}; rep(i,n)rep(j,m)if(s[i][j] != '.'){ int from = i*m+j; if(s[i][j] == 'w')rep(k,4){ int x = i + dx[k]; int y = j + dy[k]; if(x < 0 || x >= n || y < 0 || y >= m || s[x][y] == '.')continue; int to = x*m+y; add_edge(from+1,to+1,1); } if(s[i][j] == 'w') add_edge(0,from+1,1),w++; else add_edge(from+1,n*m+1,1),b++; } int num = max_flow(0,n*m+1); //cout << w << " " << b << " " << num << endl; int ans = num * 100; w -= num, b -= num; ans += 10 * min(w,b); ans += max(w,b) - min(w,b); cout << ans << endl; }