HDU 4862 Jump
?
题意:给定一个N*M的矩阵,矩阵里面为0~9的数字。现在规定从一个点可以跳到它正下方和正右方的点,花费的费用为曼哈顿距离 - 1。如果在跳的过程中,两个点的数字相同,那么将得到该点的数字。规定可以从任意点开始跳,每个点只能经过1次。最多可以选择K个点来作为起点进行跳跃。问能否经过所有的点,如果可以,那么花费的费用是多少。
?
思路:
如果是最小路径覆盖,那么很容易构造图。但这里还有个限制是要在K次走完所有的点。
最小K路径覆盖的模型,用费用流或者KM算法解决,构造二部图,X部有N*M个节点,源点向X部每个节点连一条边,流量1,费用0,Y部有N*M个节点,每个节点向汇点连一条边,流量1,费用0,如果X部的节点x可以在一步之内到达Y部的节点y,那么就连边x->y,费用为从x格子到y格子的花费能量减去得到的能量,流量1,再在X部增加一个新的节点,表示可以从任意节点出发K次,源点向其连边,费用0,流量K,这个点向Y部每个点连边,费用0,流量1,最后用这个图跑最小费用最大流,如果满流就是存在解,反之不存在,最小费用的相反数就是可以获得的最大能量。
?
代码:
?
/*
ID: wuqi9395@126.com
PROG:
LANG: C++
*/
#include
?
?
|