说实话,我是没有想到用费用流来求解的。
这道题,出看时,以为是DP。但是后来发现更本设不了状态,也转移不了。然后想了很久,只是发现了一些毫无意义的性质。
1.如果在每一个点,最多只有一个点会在上面(除了0号节点)
2.一个点走的必定是一段连续的路。这不显然吗?
3.每次走到一个点,一定走关于到这个点的最短路,且不能走没有扩展的点。
通过性质2,我们可以发现其实原问题就是选不超过k条链(可能链比较鬼畜)出来,覆盖整个图,且保证总长度最短。
通过性质3,我们可以先预处理
floyd
,
dis[i][j]
表示只经过
k<=i
|
k<=j
的点转移得到的最短路。
依照最小路径覆盖的方法。所以,考虑费用流建图:
1.
S
到
2.
S
到
3.
T
向
4.
i
向
为什么这么连呢?
.由性质1,由于每个点都可能是该路径的终点,所以每个点都向
T
连边。
如果
于是最后的最小费用最大流就是答案。
代码。。。自己写吧!反正又不难。