Treasure Hunting

这道题出的相当不错。看上去像搜索,其实可以用最大流来做,或者二分匹配也行。

题目大意:iSea和他的朋友一块去寻宝,地图上显示了很多的金币,图中有字母'A', 'B' ... 'Z', 'a', 'b' ... 'z',表示他们每次的会合地点,开始位置在A,他朋友每次以最短的距离有一个会合地点走向下一个会合地点,iSea也必须走最短路,但是他可以选择走有金币的路,不过他只有一个单位的时间可以拿到金币,也就是说,每一次的会合过程,他只能带走一块金币。问:走到最后的会合地点,iSea最多能获得多少金币。

建图过程:

首先bfs找到每次会合有可能取的金币的位置,每个位置标号设为p1,每次会合的出发点设为p2,源点S,汇点T

可以建如下三类边:<u, v, w>分别表示一条边的起点,终点,边权

1. <S, p2, 1> 表示每一次出发最多拿到1枚金币

2. <p2, p1, 1> 表示每次出发可以拿到最短路径上的任意一个金币

3. <p1, T, 1> 表示从每个有金币的位置最多拿走一枚金币

如此建图,就能够保证流量最大时,iSea拿到的金币最多,当然,符合规则。

这题还有一关键点:如何bfs求得最短路经过的所有点。其实也比较简单,直接bfs,bfs过程中给每个位置赋值最短距离,搜到目标位置,跳出,然后反向dfs,按照距离差值为1递减的顺序,所搜到的所有点,都是最短路径上的点。

这道题也可以用二分图最大匹配来做。相对于我上面的建图,去掉源点S,汇点T,即可。求得p2构成的X集合和p1构成的Y集合,题目上,每个出发点最多拿到一枚金币,求取最大金币数,正好符合二分图最大匹配的定义。

 附加两组测试数据:

2 4
A#B.
*#*C

3 4
A#B.
..*.
C...

2 4
C#B.
***A

3 5
.A**.
C*...
..B..

正解:

-1

1

2

2

 

posted on 2010-08-18 20:39  ylfdrib  阅读(966)  评论(0编辑  收藏  举报