#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int MAX=2505*2;
int r,c,v,match[MAX];
bool used[MAX];
char m[55][55];
vector<int> g[MAX];
bool dfs(int v)
{
used[v]=true;
for(int i=0;i<g[v].size();i++)
{
int &u=g[v][i],w=match[u];
if(w<0||!used[w]&&dfs(w))
{
match[u]=v;
match[v]=u;
return true;
}
}
return false;
}
int matching()
{
int ans=0;
memset(match,-1,sizeof(match));
for(int i=0;i<v*2;i++)
{
if(match[i]<0)
{
memset(used,0,sizeof(used));
if(dfs(i))
ans++;
}
}
return ans;
}
void add_edge(int u,int v)
{
g[u].push_back(v);
g[v].push_back(u);
}
int main()
{
cin>>r>>c;
v=r*c;
for(int i=0;i<r;i++)
scanf("%s",m[i]);
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
if(m[i][j]=='*')
{
int x=i,y=j;
while(x>0&&m[x-1][j]=='*')
x--;
while(y>0&&m[i][y-1]=='*')
y--;
add_edge(x*c+j,i*c+y+v);
}
}
}
cout<<matching()<<endl;
return 0;
}
最小顶点集
poj2226
最新推荐文章于 2020-07-17 21:49:53 发布