#include<iostream>
#include<cstdio>
#include<cstring>
const int maxn = 605;
using namespace std;
char map[maxn][maxn];
int n;
int vis[maxn][maxn],link[maxn*maxn],dp[maxn*maxn];
int Hash[maxn][maxn];
int fx[] = {0,0,-1,1};
int fy[] = {-1,1,0,0};
struct node
{
int u,v,next;
};
node e[maxn*1000];
int head[maxn*maxn],tot;
void add(int u, int v)
{
e[tot].u = u;
e[tot].v = v;
e[tot].next = head[u];
head[u] = tot++;
}
void init()
{
tot = 0;
memset(head, -1, sizeof(head));
memset(vis, 0, sizeof(vis));
memset(link, -1, sizeof(link));
}
int can(int u)
{
for(int i = head[u]; i != -1; i = e[i].next)
{
int v = e[i].v;
if(!dp[v])
{
dp[v] = 1;
if(link[v] == -1 || can(link[v]))
{
link[v] = u;
link[u] = v;
return 1;
}
}
}
return 0;
}
int main()
{
//freopen("input.txt","r",stdin);
int t;
scanf("%d",&t);
for(int cn = 1; cn <= t; cn++)
{
init();
scanf("%d",&n);
int num = 0;
for(int i = 0; i < n; i++)
{
scanf("%s",map[i]);
for(int j = 0; j < n; j++)
if(map[i][j] == '#')
Hash[i][j] = num++;
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(map[i][j] == '#')
{
for(int k = 0; k < 4; k++)
{
int xi = i+fx[k];
int yi = j+fy[k];
if(xi>=0&&xi<n&&yi>=0&&yi<n&&map[xi][yi]=='#')
{
add(Hash[i][j],Hash[xi][yi]);
}
}
}
}
}
int ret = 0;
for(int i = 0; i < num; i++)
{
memset(dp, 0, sizeof(dp));
if(link[i]==-1&&can(i))
ret++;
}
printf("Case %d: %d\n",cn,ret);
}
return 0;
}
二分图_HDU_4185
最新推荐文章于 2018-10-20 16:12:49 发布