瀛︾殑姣旇緝鎸紝鍐欑殑鏄痭^4鐨勭畻娉?br>瀹為檯涓婃湁m*m*n鐨勭畻娉曠殑
涓嬭竟鍑犻亾鏄畬緹庡尮閰嶇殑棰樼洰
http://info.zjfc.edu.cn/acm/problemDetail.aspx?pid=1222
璧よ8瑁哥殑瀹岀編鍖歸厤錛屽浘閮藉緩濂戒簡
http://acm.hdu.edu.cn/showproblem.php?pid=1533
榪欎釜寤哄浘寰堝鏄?br>http://acm.hdu.edu.cn/showproblem.php?pid=2282
榪欎釜闇瑕佸緩鍥?br>
涓嬭竟鏄痟ttp://acm.hdu.edu.cn/showproblem.php?pid=1533
鐨凙C浠g爜
//////////////////////////////////////////////////////////////////////////
//浜屽垎鍥劇殑瀹岀編鍖歸厤錛孠uhn錛峂unkras綆楁硶
#include<stdio.h>
#include<math.h>
#include<string>
#define MAXN 101
//////////////////////////////////////////////////////////////////////////
#define inf 0x7FFFFFFF
int edge[MAXN][MAXN];
int match[MAXN];
bool hash[MAXN][MAXN];
bool xhash[MAXN],yhash[MAXN];
char map[MAXN][MAXN];
int min(int a,int b){return a>b?b:a;}
int max(int a,int b){return a>b?a:b;}
void Scanf(int n,int m,int &l);
bool dfs(int p,int n)//鎵懼騫胯礬寰?/span>
{
int i;
for(i=0;i<n;i++)
{
if(!yhash[i] && hash[p][i])
{
yhash[i] = true;
int t = match[i];
if(t == -1 || dfs(t,n))
{
match[i] = p;
return true;
}
if(t != -1)
xhash[t] = true;
}
}
return false;
}
void show(int id,int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(id)
printf("%d ",edge[i][j]);
else
printf("%d ",hash[i][j]);
}
puts("");
}
puts("");
}
void KM_Perfect_Match(int n)
{
int i,j;
int xl[MAXN],yl[MAXN];
for(i=0;i<n;i++)
{
xl[i] = 0;
yl[i] = 0;
for(j=0;j<n;j++)
xl[i] = max(xl[i],edge[i][j]);
}
bool perfect = false;
while(!perfect)
{
for(i=0;i<n;i++)//鐜伴樁孌靛凡緇忓尮閰嶇殑璺?/span>
{
for(j=0;j<n;j++)
{
if(xl[i] + yl[j] == edge[i][j])
hash[i][j] = true;
else
hash[i][j] = false;
}
}
// show(0,n);
int cnt = 0;
memset(match,-1,sizeof(match));
for(i=0;i<n;i++)//褰撳墠鐨勫浘鏄惁鑳藉叏閮ㄥ尮閰?/span>
{
memset(xhash,false,sizeof(xhash));
memset(yhash,false,sizeof(yhash));
if(dfs(i,n))
cnt ++;
else
{
xhash[i] = true;
break;
}
}
if(cnt == n)//娌℃湁澧炲箍璺緞
perfect = true;
else
{
int ex = inf;
for(i=0;i<n;i++)
{
for(j=0;xhash[i] && j<n;j++)
{
if(!yhash[j])
ex = min(ex,xl[i] + yl[j] - edge[i][j]);//鎵懼埌涓鏉℃病寤虹殑杈圭殑鏈灝忓?/span>
}
}
for(i=0;i<n;i++)//鏍規嵁榪欎釜杈規潵榪涜鏉懼紱
{
if(xhash[i])
xl[i] -= ex;
if(yhash[i])
yl[i] += ex;
}
}
}
}
int main()
{
int n,m,l;
while(scanf("%d%d",&n,&m))
{
if(n == 0 && m == 0)
break;
Scanf(n,m,l);
KM_Perfect_Match(l);
int mindis = 0;
for(int i=0;i<l;i++)
mindis += edge[match[i]][i];
printf("%d\n",-mindis);
}
return 0;
}
//璇誨叆寤哄浘
void Scanf(int n,int m,int &l)
{
int i,j,l1,l2;
struct Point{
int x,y;
}MAN[MAXN],HOUSE[MAXN];
l1 = l2 = 0;
for(i=0;i<n;i++)
{
scanf("%s",map[i]);
for(j=0;j<m;j++)
{
if(map[i][j]=='m')
{
MAN[l1].x = i;
MAN[l1].y = j;
l1 ++;
}
else if(map[i][j]=='H')
{
HOUSE[l2].x = i;
HOUSE[l2].y = j;
l2 ++;
}
}
}
l = l1;
for(i=0;i<l;i++)
for(j=0;j<l;j++)
edge[i][j] = -abs(MAN[i].x - HOUSE[j].x) - abs(MAN[i].y - HOUSE[j].y);
}

]]>