博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj2446
阅读量:6871 次
发布时间:2019-06-26

本文共 1760 字,大约阅读时间需要 5 分钟。

二分图匹配,每个点只判断与其周围各点的匹配情况,难点在于对于一个编号求期所在的行列,以及对于给出的坐标求编号。

ContractedBlock.gif
ExpandedBlockStart.gif
View Code
 
#include
<
iostream
>
#include
<
cstdio
>
#include
<
cstdlib
>
#include
<
cstring
>
using
namespace
std;
#define
maxn 70
int
n, m, h;
bool
map[maxn][maxn];
int
xM[maxn
*
maxn], yM[maxn
*
maxn];
bool
chk[maxn
*
maxn];
int
uN, vN;
int
dir[
4
][
2
]
=
{
{
1
,
0
},
{
0
,
1
},
{
-
1
,
0
},
{
0
,
-
1
} };
int
getx(
int
a)
{
if
(m
&
1
)
return
(a
*
2
+
1
)
/
m;
return
a
/
(m
/
2
);
}
int
gety(
int
a)
{
if
(m
&
1
)
return
(a
*
2
+
1
)
%
m;
int
x
=
getx(a);
return
1
-
x
%
2
+
(a
*
2
-
x
*
m);
}
int
hash(
int
x,
int
y)
{
if
(x
<
0
||
y
<
0
||
x
>=
n
||
y
>=
m)
return
-
1
;
if
(map[x][y])
return
-
1
;
if
(m
&
1
)
return
(x
*
m
+
y)
/
2
;
return
x
*
(m
/
2
)
+
y
/
2
;
}
bool
SearchPath(
int
u)
{
int
x
=
getx(u);
int
y
=
gety(u);
if
(map[x][y])
return
false
;
for
(
int
i
=
0
; i
<
4
; i
++
)
{
int
v
=
hash(x
+
dir[i][
0
], y
+
dir[i][
1
]);
if
(v
!=
-
1
&&
!
chk[v])
{
chk[v]
=
true
;
if
(yM[v]
==
-
1
||
SearchPath(yM[v]))
{
yM[v]
=
u;
xM[u]
=
v;
return
true
;
}
}
}
return
false
;
}
int
MaxMatch()
{
int
u, ret
=
0
;
memset(xM,
-
1
,
sizeof
(xM));
memset(yM,
-
1
,
sizeof
(yM));
for
(u
=
0
; u
<
uN; u
++
)
if
(xM[u]
==
-
1
)
{
memset(chk,
0
,
sizeof
(chk));
if
(SearchPath(u))
ret
++
;
}
return
ret;
}
int
main()
{
//
freopen("t.txt", "r", stdin);
scanf(
"
%d%d%d
"
,
&
n,
&
m,
&
h);
memset(map,
0
,
sizeof
(map));
uN
=
m
*
n
/
2
;
vN
=
m
*
n
-
uN;
for
(
int
i
=
0
; i
<
h; i
++
)
{
int
a, b;
scanf(
"
%d%d
"
,
&
a,
&
b);
a
--
;
b
--
;
map[b][a]
=
true
;
}
if
((m
*
n
-
h)
&
1
)
{
printf(
"
NO\n
"
);
return
0
;
}
int
ans
=
MaxMatch();
if
(ans
<
(m
*
n
-
h)
/
2
)
printf(
"
NO\n
"
);
else
printf(
"
YES\n
"
);
return
0
;
}

转载于:https://www.cnblogs.com/rainydays/archive/2011/05/22/2053262.html

你可能感兴趣的文章
UNION并集运算
查看>>
如何关掉UAC?
查看>>
请保护我们的地球
查看>>
jenkins 神奇变量
查看>>
Linux 输出文件列数,拼接文件
查看>>
迷你MVVM框架 avalonjs 学习教程2、模块化、ViewModel、作用域
查看>>
atitit.避免NullPointerException 总结and 最佳实践 o99
查看>>
uGUI练习(七) Drag And Drop
查看>>
kernel32.dll出错解决方案
查看>>
白话经典算法系列之七 堆与堆排序
查看>>
DevExpress,LayoutControl,TreeList,GridControl等
查看>>
安卓高手之路之PackageManagerservice
查看>>
noise_process.c
查看>>
Chrome调试大全--转载
查看>>
AppBoxPro - 细粒度通用权限管理框架(可控制表格行内按钮)源码提供下载
查看>>
[转]WinForm如何调用Web Service
查看>>
android onTouch()与onTouchEvent()的区别
查看>>
SSH框架总结(框架分析+环境搭建+实例源代码下载)
查看>>
Linux ln命令具体解释及使用
查看>>
敏捷软件开发模型--SCRUM
查看>>