# POJ3621

题意:


给定一张有向图,每个点有权值 \(fun[i]\) ,每条边有权值 \(time[i]\)

要求找出一个环,使得环上所有点的点权和除以所有边的边权和最大

解:


首先,显然,这是一道01分数规划题

参照分数规划的套路

假定当前二分的值为 \(mid\) ,有环 \(S=(\{v\},\ \{e\})\) ,环有 \(t\) 个点和 \(t\) 条边

考虑是否存在 \(S\) 使得

\[\sum_{i=1}^{t}(mid*time_{i}-fun_{i})<0 \\ 即\quad\exists S=(\{v\},\ \{e\})\quad使得\quad mid<\frac{\sum_{i=1}^{t}fun_{i}}{\sum_{i=1}^{t}time_{i}} \]

此时答案应该大于 \(mid\)

若不存在这样的 \(S\) ,则

\[\forall S,\quad mid\geqslant \frac{\sum_{i=1}^{t}fun_{i}}{\sum_{i=1}^{t}time_{i}} \]

此时答案应该小于等于 \(mid\)

问题又来了,如何判断是否存在 \(S\) ?

有这样的办法:

在每次选定 \(mid\) 之后

新建一个与原图一样的图,但是没有点权,只有边权,并对边权值做如下修改

\(\forall e_{i}=edge(x\ ->\ y),\quad weight(x\ ->\ y)=mid*time_{e_{i}}-fun_{x}\)

这样建图有什么好处?

这样,若要判定 \(\sum_{i=1}^{t}(mid*time_{i}-fun_{i})<0\) ,刚好对应图中存在“负环”

由此,在新建的图上跑SPFA,有负环说明 \(mid<\frac{\sum_{i=1}^{t}fun_{i}}{\sum_{i=1}^{t}time_{i}}\)

没有则说明 \(mid\geqslant \frac{\sum_{i=1}^{t}fun_{i}}{\sum_{i=1}^{t}time_{i}}\)

上一篇:【离散优化】P-中值模型


下一篇:【柯】代数学引论 第2章 §3.线性映射. 矩阵的运算