(楼下的小学生好烦啊,老是在那里红星闪闪QAQ,感觉要被洗脑了,md一整天都是智障状态)
这题没有硬石头就直接跑二分图匹配就好了
有硬石头就把这行/列拆一拆
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
#include<map>
#include<set>
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
#define mmt(a,v) memset(a,v,sizeof(a))
#define tra(i,u) for(int i=head[u];i;i=e[i].next)
using namespace std;
const int N=50+5;
const int inf=1e9;
struct Edge{int to,next;}e[200005];
int head[N*N],cnt=1;
void ins(int u,int v){e[++cnt]=(Edge){v,head[u]};head[u]=cnt;}
bool vis[N*N];
int linked[N*N];
bool match(int u){
tra(i,u){
int v=e[i].to;
if(vis[v])continue;
vis[v]=true;
if(!linked[v]||match(linked[v])){
linked[v]=u;
return true;
}
}
return false;
}
int col[N][N];
char mp[N][N];
int main(){
//freopen("a.in","r",stdin);
int n,m;scanf("%d %d",&n,&m);
rep(i,1,n)scanf("%s",mp[i]+1);
int id=0;
rep(j,1,m){
id++;
rep(i,1,n){
if(mp[i][j]=='#')id++;
col[i][j]=id;
}
}
id=0;
rep(i,1,n){
id++;
rep(j,1,m){
if(mp[i][j]=='#')id++;
if(mp[i][j]=='*')ins(id,col[i][j]);
}
}
int ans=0;
rep(i,1,id){
mmt(vis,0);
ans+=match(i);
}
printf("%d\n",ans);
return 0;
}