您的位置:首页 > 其它

hdu1045 Fire Net

2012-12-22 19:41 190 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1045

二分图匹配,匈牙利算法(dfs+邻接矩阵),König定理

需要自己建新图

以前用搜索做过~ 感觉建图好神奇

#include <stdio.h>
#include <string.h>
#define N 10

int n, m;
int map0

, map1

, map2

;
int map

, girl
, flag
;

int find(int x)
{
int i;
for(i=1; i<=m; i++)
{
if(!flag[i] && map[x][i])
{
flag[i] = 1;
if(girl[i]==-1 || find(girl[i]))
{
girl[i] = x;
return 1;
}
}
}
return 0;
}

int main()
{
int n0, i, j, sum, count;
char c;
while(scanf("%d%*c", &n0), n0)
{
//初始化
memset(map, 0, sizeof(map));
memset(girl, -1, sizeof(girl));
for(i=1; i<=n0; i++)
{
map0[i][0] = map0[0][i] = 1;
for(j=1; j<=n0; j++)
{
scanf("%c", &c);
map0[i][j] = c-'.';
}
getchar();
}
//给每个点编一个新行号
count = 0;
for(i=1; i<=n0; i++)
{
for(j=1; j<=n0; j++)
{
if(map0[i][j-1] && (!map0[i][j]))
{
count ++;
}
map1[i][j] = count;
}
}
n = count;
//给每个点编一个新列号
count = 0;
for(j=1; j<=n0; j++)
{
for(i=1; i<=n0; i++)
{
if(map0[i-1][j] && (!map0[i][j]))
{
count ++;
}
map2[i][j] = count;
}
}
m = count;
//根据新的行列号,建图
for(i=1; i<=n0; i++)
{
for(j=1; j<=n0; j++)
{
if(!map0[i][j])
{
map[map1[i][j]] [map2[i][j]] = 1;
}
}
}
//匈牙利算法
sum = 0;
for(i=1; i<=n; i++)
{
memset(flag, 0, sizeof(flag));
sum += find(i);
}
printf("%d\n", sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: