#include<stdio.h>
#include<string.h>
#include<math.h>
#define max(a,b)(a>b?a:b)
#define min(a,b)(a<b?a:b)
#define inf 999999999
#define size 110
int n,m,map[size][size],lx[size],ly[size],match[size];
int visitx[size],visity[size];
struct node
{
int x,y;
}a[size],b[size];
int find(int u)
{
visitx[u]=true;
for(int i=1;i<=m;i++)
{
if(!visity[i]&&lx[u]+ly[i]==map[u][i])
{
visity[i]=true;
if(match[i]==-1||find(match[i]))
{
match[i]=u;
return true ;
}
}
}
return false ;
}
void KM_prefect_match()
{
int tmp,i,j,k;
for(i=1;i<=n;i++)
lx[i]=-inf;
memset(ly,0,sizeof(ly));
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
lx[i]=max(lx[i],map[i][j]);
}
for(i=1;i<=n;i++)
{
while(1)
{
memset(visitx,0,sizeof(visitx));
memset(visity,0,sizeof(visity));
if(find(i)) break;
else
{
tmp=inf;
for(j=1;j<=n;j++)
{
if(visitx[j])
{
for(k=1;k<=n;k++)
if(!visity[k])
tmp=min(tmp,lx[j]+ly[k]-map[j][k]);
}
}
for(j=1;j<=n;j++)
{
if(visitx[j])
lx[j]-=tmp;
if(visity[j])
ly[j]+=tmp;
}
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m),m+n)
{
memset(match,-1,sizeof(match));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
map[i][j]=-inf;
}
}
char str[size][size];
int e=1,ee=1;
for(i=0;i<n;i++)
{
scanf("%s",str[i]);
for(int j=0;j<m;j++)
{
if(str[i][j]=='m')
{
a[e].x=i;
a[e++].y=j;
}
else if(str[i][j]=='H')
{
b[ee].x=i;
b[ee++].y=j;
}
}
}
for(i=1;i<=e;i++)
{
for(int j=1;j<=ee;j++)
map[i][j]=-(abs(a[i].x-b[j].x)+abs(a[i].y-b[j].y));
}
n=e-1;
m=ee-1;
KM_prefect_match();
int ans=0;
for(i=1;i<=n;i++)
ans+=map[match[i]][i];
printf("%d\n",-ans);
}
return 0;
}
hdu 1533 Going Home(KM)
最新推荐文章于 2019-06-20 15:23:50 发布