#include<stdio.h>
#include<math.h>
#define INF 0x3f3f3f3f
#define min(x,y) ((x)>(y)?(y):(x))
#define max(x,y) ((x)>(y)?(x):(y))
int n,m,A[116][2],B[116][2];
int map[100+16][100+16];
int match[100+16],ex[116],ey[116],vis_x[116],vis_y[116],slack[116];
int id1,id2;
int dfs(x)
{
int y,gap;
vis_x[x]=1;
for(y=0;y<id2;y++)
{
if(vis_y[y])
continue;
gap=ex[x]+ey[y]-map[x][y];
if(gap==0)
{
vis_y[y]=1;
if(match[y]==-1||dfs(match[y]))
{
match[y]=x;
return 1;
}
}
else
if(slack[y]>gap)
slack[y]=gap;
}
return 0;
}
int KM(void)
{
int i,j,d,res;
memset(match,-1,sizeof(match));
memset(ey,0,sizeof(ey));
for(i=0;i<id1;i++)
{
ex[i]=map[i][0];
for(j=1;j<id2;j++)
{
ex[i]=max(ex[i],map[i][j]);
}
}
for(i=0;i<id1;i++)
{
memset(slack,0x3f,sizeof(slack));
while(1)
{
memset(vis_x,0,sizeof(vis_x));
memset(vis_y,0,sizeof(vis_y));
if(dfs(i))
break;
d=INF;
for(j=0;j<id2;j++)
{
if(!vis_y[j]&&d>slack[j])
d=slack[j];
}
for(j=0;j<id1;j++)
{
if(vis_x[j])
ex[j]-=d;
}
for(j=0;j<id2;j++)
if(vis_y[j])
ey[j]+=d;
else
slack[j]-=d;
}
}
res=0;
for(i=0;i<id1;i++)
{
if(match[i]>-1)
res+=map[match[i]][i];
}
return res;
}
int main()
{
int i,j;
char st[200];
while(~scanf("%d%d",&n,&m))
{
memset(map,0,sizeof(map));
if(n==0&&m==0)
break;
id1=id2=0;
for(i=0;i<n;i++)
{
scanf("%s",st);
for(j=0;j<m;j++)
{
if(st[j]=='.')
continue;
if(st[j]=='m')
{
A[id1][0]=i;
A[id1++][1]=j;
}
else
{
B[id2][0]=i;
B[id2++][1]=j;
}
}
}
for(i=0;i<id1;i++)
{
for(j=0;j<id2;j++)
{
map[i][j]=210-(abs(A[i][0]-B[j][0])+abs(A[i][1]-B[j][1]));
}
}
printf("%d\n",210*id1-KM());
}
}
poj 2195 最大权匹配
最新推荐文章于 2021-04-24 17:54:45 发布