#include<stdio.h>
#include<string.h>
#include<iostream>
#define ll long long
#define N 300010
using namespace std;
int e[1000][1000];
int map2[1000][1000];
char map1[1000][1000];
int book[1000];
int f[1000];
int cont;
int dfs(int x)
{
for(int i=0;i<cont;i++)
{
if(e[x][i]&&!book[i])
{
book[i]=1;
if(f[i]==-1||dfs(f[i]))
{
f[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
int t,tt=0;
scanf("%d",&t);
while(t--)
{tt++;
memset(e,0,sizeof(e));
int n;
scanf("%d",&n);
cont=0; //getchar();
for(int i=0;i<n;i++)
{
scanf("%s",map1[i]);
for(int j=0;j<n;j++)
{
//scanf(" %c",&map1[i][j]);
if(map1[i][j]=='#')
{
map2[i][j]=cont++;
}
}
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(map1[i][j]!='#')
continue;
if(j-1>=0&&map1[i][j-1]=='#')
e[map2[i][j]][map2[i][j-1]]=1;
if(j+1<n&&map1[i][j+1]=='#')
e[map2[i][j]][map2[i][j+1]]=1;
if(i+1<n&&map1[i+1][j]=='#')
e[map2[i][j]][map2[i+1][j]]=1;
if(i-1>=0&&map1[i-1][j]=='#')
e[map2[i][j]][map2[i-1][j]]=1;
}
memset(f,-1,sizeof(f));
int ans=0;
for(int i=0;i<cont;i++)
{
memset(book,0,sizeof(book));
if(dfs(i))ans++;
}
printf("Case %d: ",tt);
printf("%d\n",ans/2);
}
}
二分图匹配 匈牙利算法 hdu 4185
最新推荐文章于 2018-11-26 22:37:10 发布