#include<stdio.h>
#include<string.h>
#include<math.h>
#define inf 9999999
#define N 200
int map[N][N],mark[N],s[N],lx[N],ly[N],link[N],n1,n2;
char str[N][N];
struct node
{
int x,y;
}a[200],b[200];
int max(int a,int b)
{
return a>b?a:b;
}
int min(int a,int b)
{
return a<b?a:b;
}
int find(int k)
{
int i;
s[k]=1;
for(i=0;i<n2;i++)
{
if(mark[i]==0&&lx[k]+ly[i]==map[k][i])
{
mark[i]=1;
if(link[i]==-1||find(link[i])==1)
{
link[i]=k;
return 1;
}
}
}
return 0;
}
int km()
{
int ans=0,i,j,k,a;
memset(ly,0,sizeof(ly));
memset(link,-1,sizeof(link));//为下文做准备
for(i=0;i<n1;i++)//注意怎样初始化的
{
lx[i]=map[i][0];
for(j=1;j<n2;j++)
lx[i]=max(lx[i],map[i][j]);
}
for(i=0;i<n1;i++)
{
while(1)
{
memset(s,0,sizeof(s));
memset(mark,0,sizeof(mark));
if(find(i)==1)
break;
else
{
a=inf;
for(j=0;j<n1;j++)
{
if(s[j])
{
for(k=0;k<n2;k++)
if(!mark[k])
a=min(a,lx[j]+ly[k]-map[j][k]);
}
}
for(j=0;j<n1;j++)
if(s[j])
lx[j]-=a;
for(j=0;j<n2;j++)
if(mark[j])
ly[j]+=a;
}
}
}
for(i=0;i<n2;i++)
{
if(link[i]>=0)//有可能房子多,人少,有房子没人住,需判断一下
ans+=map[link[i]][i];
}
return ans;
}
int main()
{
int n,m,i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
for(i=0;i<n;i++)
scanf("%s",str[i]);
n1=0;n2=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(str[i][j]=='m')
{
a[n1].x=i;
a[n1].y=j;
n1++;
}
if(str[i][j]=='H')
{
b[n2].x=i;
b[n2].y=j;
n2++;
}
}
}
for(i=0;i<n1;i++)
for(j=0;j<n2;j++)
map[i][j]=-(abs(a[i].x-b[j].x)+abs(a[i].y-b[j].y));//注意负号
printf("%d\n",-km());
}
return 0;
}
hdu 1533
最新推荐文章于 2020-05-17 19:07:21 发布