[POJ 3020]

Antenna Placement

二分图匹配。

其实是很久以前做的题目了。今天被Usozki问了下这题怎么做,看了他的代码,感觉值得改进的地方不少……便自己着手重做了下这题,希望能讲清边表的写法。由于之前hackerhank出过一题很刁钻的匈牙利,觉得已经把这个算法弄得很透彻了(包括递归改非递归、每轮匈牙利时局部链表指针改全局、每次不重新memste标记数组等等),但这次重写这题还是用了很久。

这里用了一个题目的特点(可以染色成国际象棋棋盘那样的二分图),使得每个匹配的共算了两次;又或者其实可以每次仅从一种颜色的点出发,这样就只算一次匹配。

这是今天写的代码:

这里建图是先编号,再检查上方和左方是否存在点,然后加边的。代码里函数功能应该都区分得很明显了。这样写出来的边表,是做很多图论题时必须使用的数据结构(甚至其他类型题目里也经常用到)。无论是时间、空间,还是代码实现难度方面都是很好的。

另外也贴下以前写的,当时不会用边表,但是代码还算是比较齐整了: