#include <bits/stdc++.h>
#include<atcoder/maxflow>
using namespace std;
#define rep(i,a,n) for (int i=a;i<(int)n;i++)
int read(){int r;scanf("%d",&r);return r;}
char s[310][310];
int main(){
int h=read();
int w=read();
rep(i,0,h)scanf("%s",s[i]);
auto x=vector(h,vector(w,0)); // 以首个为行标识
auto y=vector(h,vector(w,0)); // 以首个+hw为列标识
const int S=2*h*w;
const int T=S+1;
atcoder::mf_graph<int>g(T+1);
rep(i,0,h)rep(j,0,w)if(s[i][j]=='.'){
int curi=i*w+j;
int curj=curi+h*w;
x[i][j]=(i&&s[i-1][j]=='.')?x[i-1][j]:curi;
y[i][j]=(j&&s[i][j-1]=='.')?y[i][j-1]:curj;
if(x[i][j]==curi)g.add_edge(S,curi,1);
if(y[i][j]==curj)g.add_edge(curj,T,1);
g.add_edge(x[i][j],y[i][j],1000000000);
}
printf("%d\n",g.flow(S,T));
}
./Main.cpp: In function ‘int read()’:
./Main.cpp:5:23: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
5 | int read(){int r;scanf("%d",&r);return r;}
| ~~~~~^~~~~~~~~
./Main.cpp: In function ‘int main()’:
./Main.cpp:10:18: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
10 | rep(i,0,h)scanf("%s",s[i]);
| ~~~~~^~~~~~~~~~~