This problem has been found in several quizzes!
Great pressure!
What I learned now!
Ah ·································
# 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 100000000
Struct Node
{
Int X, Y;
} House [1, 1010], men [2, 1010];
Int N;
Int map [1010] [1010], SX [1010], Sy [1010], LX [1010], Ly [1010], Match [1010];
Int find (int K)
{
Int I;
SX [k] = 1;
For (I = 1; I <= N; I ++)
{
If (Map [k] [I] = Lx [k] + ly [I] & Sy [I] = 0)
{
Sy [I] = 1;
If (Match [I] = 0 | find (Match [I]) = 1)
{
Match [I] = K;
Return 1;
}
}
}
Return 0;
}
Int km ()
{
Int I, J, K, ANS = 0;
Memset (match, 0, sizeof (MATCH ));
Memset (LX, 0, sizeof (LX ));
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 (sx, 0, sizeof (SX ));
Memset (SY, 0, sizeof (SY ));
If (find (I) break;
Else
{
Int A = inf;
For (j = 1; j <= N; j ++)
If (SX [J])
{
For (k = 1; k <= N; k ++)
If (! Sy [k])
A = min (A, LX [J] + ly [k]-map [J] [k]);
}
For (j = 1; j <= N; j ++)
{
If (SX [J]) lx [J]-=;
If (SY [J]) ly [J] + =;
}
}
}
}
For (I = 1; I <= N; I ++)
Ans + = map [Match [I] [I];
Return ans;
}
Int main ()
{
Int W, E, I, J, flag1, flag2;
Char AA [2, 1010] [1010]
While (scanf ("% d", & W, & E), w + E)
{
Flag1 = 0; flag2 = 0;
For (I = 0; I <W; I ++)
{
Scanf ("% s", AA [I]);
For (j = 0; j <E; j ++)
{
If (AA [I] [J] = 'H ')
{
Flag2 ++;
House [flag2]. x = I;
House [flag2]. Y = J;
}
Else if (AA [I] [J] = 'M ')
{
Flag1 ++;
Men [flag1]. x = I;
Men [flag1]. Y = J;
}
}
}
For (I = 1; I <= flag1; I ++)
For (j = 1; j <= flag2; j ++)
Map [I] [J] =-(ABS (House [J]. x-Men [I]. x) + ABS (House [J]. y-MEN [I]. Y ));
N = flag1;
Int ans = km ();
Printf ("% d \ n",-ans );
}
Return 0;
}
Question link: http://acm.hdu.edu.cn/showproblem.php? PID = 1, 1533