题目在这里:HDOJ3468
解释一下题意
题目给了一张地图,地图上有墙/空地/宝藏/集合点’A’~’Z’~’a’~’z’
要求按顺序以最短路径访问集合点,每次最短路径可以最多拿一个宝藏,每个宝藏只能被拿一次,问到最后一个集合点的时候最多拿多少宝藏
先确认算法 显然这里要用到最短路径(bfs解决)
观察到每个宝藏只能被拿一次 最后求最多拿多少宝藏
考虑网络流(最大流)
考虑网络流建模:
超级源点s连接每个集合点,权值为1(因为每次从集合点出发拿宝藏,每次最短路只能拿一个)
超级汇点t连接每一个宝藏 权值为1(用于计数拿了多少宝藏)
在最短路径point[i]->point[i+1]中的所有宝藏与point[i]连边,权值为1(表示在从point[i]->point[i+1]的过程中可以取这个宝藏)
然后从s->t跑一边最大流就是答案
有一些小细节和实现
1) 当寻找最短路的时候发现走不到下一个集合点直接退出
2) 怎么判断一个宝藏是否在最短路径?先A->B跑一边最短路记录diss 然后B->A 用bfs或者dfs按diss[i][j]==diss[pre_i][pre_j]+1的规则往回走回去 如果当前的点是宝藏就连边
上代码:
1 |
|