观光奶牛
题目描述
给定一张 \(L\) 个点、\(P\) 条边的有向图,每个点都有一个权值 \(f[i]\),每条边都有一个权值 \(t[i]\)。
求图中的一个环,使“环上各点的权值之和”除以“环上各边的权值之和”最大。
输出这个最大值。
注意:数据保证至少存在一个环。
01分数规划问题
步骤:
- 确认答案区间,然后二分,判断性质
- 借助上述二分出的中点,推导出性质的公式
- 套用图论模板算法
本题首先我们要求的是在一个环内 \(\dfrac{\sum f(i)}{\sum t(i)}\) 的最大值
这个答案本身具有二分的性质【存在标准大于等于k的环 | 不存在】,我们就是要二分到他的最大值
根据数据范围可以推断出答案是在 \([1,1000]\) 上的浮点数二分问题
利用二分出的 \(mid\),我们有公式 \(\dfrac{\sum f(i)}{\sum t(i)}>mid\) ,对公式进行变形
\[\begin{aligned}\dfrac{\sum f(i)}{\sum t(i)}&>mid \\ \sum f(i)&>\sum t(i)\times mid \\ \sum f(i)-\sum t(i)\times mid&>0 \\ \sum(f(i)-t(i)\times mid)&>0\end{aligned}\]
因此,根据上述推导公式,满足条件的 \(mid\),即为图内存在一个环,满足 \(\sum(f(i)-t(i)\times mid)>0\)
spfa算法本身具有一个性质,就是在求解最短路的时候,是可以把点权和边权看做一个整体边权一起更新的,因此我们常常在一些spfa的图论问题中,把点权存入边权中进行计算。
这题我们就要利用到spfa的性质,把边权 \(t(i)\) 换成 \(f(i)−t(i)\times mid\) 来存储,把每个点的权值存入他的出边中
这样,原问题就转换成了求一个图中是否存在一个正环的问题了
求图中是否存在正环,和求负环是一个对称问题,直接更改spfa算法中的不等号方向,转而变成求最长路算法中是否存在正环,即可办到。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
|