水个博客玩。

$01$分数规划。

题目要求$\frac{F - \sum_{i = 1}^{n}C_i}{T_i}$最大,设$\frac{F - \sum_{i}C_i}{T_i} \geq e$,移项一下可以得到$F - \sum_{i }(e * T_i + C_i) \geq 0$。

那么在外层二分一个$e$,然后把所有边的权值设成$e * T_i + C_i$做最小生成树,假设这样子生成树的权值为$res$,如果$F - res > 0$ 那么说明答案还可以更大,否则更小。

时间复杂度$O(mlogmlogn(MaxInt))$。

Code:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef double db; const int N = ;
const int M = ;
const db eps = 1e-;
const db inf = 1e10; int n, m, ufs[N];
ll cur; struct Pathway {
int u, v;
ll c, t;
db val; friend bool operator < (const Pathway &x, const Pathway &y) {
return x.val < y.val;
} } pat[M]; template <typename T>
inline void read(T &X) {
X = ; char ch = ; T op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} int find(int x) {
return x == ufs[x] ? x : ufs[x] = find(ufs[x]);
} inline bool chk(db mid) {
for(int i = ; i <= m; i++)
pat[i].val = mid * pat[i].t + 1.0 * pat[i].c; sort(pat + , pat + + m);
for(int i = ; i <= n; i++) ufs[i] = i;
int cnt = ; db res = ;
for(int i = ; i <= m; i++) {
int u = find(pat[i].u), v = find(pat[i].v);
if(u == v) continue;
ufs[u] = v;
++cnt;
res += pat[i].val;
if(cnt >= n - ) break;
} return (1.0 * cur - res) > ;
} int main() {
read(n), read(m), read(cur);
for(int i = ; i <= m; i++)
read(pat[i].u), read(pat[i].v), read(pat[i].c), read(pat[i].t); db ln = 0.0, rn = inf, mid, res = 0.0;
for(; ln + eps <= rn; ) {
mid = (ln + rn) * 0.5;
if(chk(mid)) ln = mid, res = mid;
else rn = mid;
} printf("%.4f\n", res);
return ;
}

最新文章

  1. table里面,怎么根据checkbox选择的一行中的某个单元格的值是否为空,来判断是否该选中
  2. 大熊君JavaScript插件化开发------(第二季)
  3. Java 判断整数方法
  4. JAVA之Forward 和 Redirect的区别
  5. Seq_file文件系统实例剖析
  6. linux下svn命令使用大全
  7. Cocos2d-x 学习资料推荐
  8. 利用jquery给指定的table动态添加一行、删除一行
  9. nginx upstream的几种配备方式
  10. 最简单的基于FFMPEG的转码程序
  11. Usage of readonly and const
  12. 推荐一本好书给即将走入工作的程序员and程序媴
  13. java类中的static成员变量和static方法简单介绍,持续补充
  14. A股暴跌三日市值蒸发4.2万亿 股民人均浮亏超2万
  15. PHP6天基础知识部分
  16. Java日志输出问题
  17. js获取当前iframe的ID
  18. apicloud 消息推送与接收
  19. FTP内容
  20. P2045 方格取数加强版 最大费用最大流

热门文章

  1. Java中小数保留问题
  2. [Luogu3769][CH弱省胡策R2]TATT
  3. call、apply、bind用法区别
  4. matlab中freqz的用法以及多项式的展开
  5. 向HDFS中追加内容
  6. 【openCV学习笔记】【2】读取并播放一段视频
  7. grep 命令使用指南
  8. c# HttpWebResponse 调用WebApi
  9. PHP 16 个编程法则
  10. Python3 的urllib实例