您的位置:首页 > 其它

二分图匹配 匈牙利算法 hdu 4185

2017-07-20 12:59 288 查看
#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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: