poj3020

匈牙利,似乎还是有多余空格

View Code
#include <iostream>
#include
<cstdio>
#include
<cstdlib>
#include
<cstring>
using namespace std;

#define maxn 55

char map[maxn][maxn];
bool chk[maxn][maxn];
int match[maxn][maxn];
int tot, n, m;
int dir[4][2] =
{
{
0, 1 },
{
1, 0 },
{
-1, 0 },
{
0, -1 } };

void input()
{
scanf(
"%d%d", &n, &m);
gets(map[
0]);
tot
= 0;
for (int i = 0; i < n; i++)
gets(map[i]);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (map[i][j] == '*')
tot
++;
}

bool SearchPath(int x, int y)
{
for (int i = 0; i < 4; i++)
{
int x1 = x + dir[i][0];
int y1 = y + dir[i][1];
if (!chk[x1][y1] && map[x1][y1] == '*')
{
chk[x1][y1]
= true;
if (match[x1][y1] == -1 || SearchPath(x1 - dir[match[x1][y1]][0],
y1
- dir[match[x1][y1]][1]))
{
match[x1][y1]
= i;
return true;
}
}
}
return false;
}

int MaxMatch()
{
int ret = 0;
memset(match,
-1, sizeof(match));
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (((i + j) & 1) && map[i][j] == '*' && match[i][j] == -1)
{
memset(chk,
0, sizeof(chk));
if (SearchPath(i, j))
ret
++;
}
return ret;
}

int main()
{
//freopen("t.txt", "r", stdin);
int t;
scanf(
"%d", &t);
while (t--)
{
input();
printf(
"%d\n", tot - MaxMatch());
}
return 0;
}

posted @ 2011-06-25 22:08  金海峰  阅读(333)  评论(0编辑  收藏  举报