#include<stdio.h>
#define N 1000
int map[N][N],vis[N],match[N];
int R,C,nx=0,ny=0;
int dfs(int x)
{
int i;
for(i=1;i<=ny;i++)
{
if(!vis[i]&&map[x][i])
{
vis[i]=1;
if(match[i]==-1||dfs(match[i]))
{
match[i]=x;
return 1;
}
}
}
return 0;
}
int solve()
{
int i,ans=0;
memset(match,-1,sizeof(match));
for(i=1;i<=nx;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
ans++;
}
return ans;
}
int main(void)
{
char st[100][100];
int i,j,ex[100][100],ey[100][100];
scanf("%d%d",&R,&C);
memset(ex,0,sizeof(ex));
memset(ey,0,sizeof(ey));
memset(map,0,sizeof(map));
for(i=0;i<R;i++)
scanf("%s",st[i]);
for(i=0;i<R;i++)
{
for(j=0;j<C;j++)
{
if(st[i][j]=='*')
{
if(j==0)
ex[i][j]=++nx;
else
{
if(st[i][j-1]=='*')
ex[i][j]=ex[i][j-1];
else
ex[i][j]=++nx;
}
}
}
}
for(j=0;j<C;j++)
{
for(i=0;i<R;i++)
{
if(st[i][j]=='*')
{
if(i==0)
ey[i][j]=++ny;
else
{
if(st[i-1][j]=='*')
ey[i][j]=ey[i-1][j];
else
ey[i][j]=++ny;
}
map[ex[i][j]][ey[i][j]]=1;
}
}
}
printf("%d\n",solve());
}
poj 2226 二分图匹配
最新推荐文章于 2020-04-23 16:15:20 发布