AcWing 361. 观光奶牛
时间:2019-11-23
本文章向大家介绍AcWing 361. 观光奶牛,主要包括AcWing 361. 观光奶牛使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
01规划
设答案为 \(ans\)。
二分答案,设当前二分值为 \(mid\)。
设一个环 \(S\) 的边权为 \(t_1, t_2, t_3...\),点权为 \(f_1, f_2, f_3...\)
若 \(mid <= ans\),即存在一个环\(S\)使得 \(mid <= \frac{\sum f_i}{\sum t_i}\),变换一下:\(\sum(mid * t_i - f_i) <= 0\)
否则,则 \(mid > ans\)
每次 \(check\) 的时候,一条 \(u\) 指向 \(v\),边权为 \(w\) 的边权变为:
\(w * mid - f_u\)。我们只需检查这个图是否存在负环即可。
时间复杂度
最坏情况存在长度为 \(L\) 的环, \(\sum t_i = L, \sum f_i = 1000L\)。故答案最大可能是 \(1000\)。
\(Log_21000 \approx 10\)
\(O(10*LP)\)。判负环的时间一般情况下低于 \(O(LP)\)。
#include <cstdio>
#include <iostream>
using namespace std;
const int N = 1005, M = 5005;
int n, q[N * M], m, f[N], cnt[N];
int head[N], numE = 0;
double dis[N];
bool vis[N];
struct E{
int next, v, w;
}e[M];
void add(int u, int v, int w) {
e[++numE] = (E) { head[u], v, w };
head[u] = numE;
}
bool inline check(double mid) {
int hh = 0, tt = -1;
for (int i = 1; i <= n; i++)
vis[i] = true, dis[i] = cnt[i] = 0, q[++tt] = i;
while(hh <= tt) {
int u = q[hh++];
vis[u] = false;
for (int i = head[u]; i; i = e[i].next) {
int v = e[i].v;
double w = e[i].w * mid - f[u];
if(dis[u] + w < dis[v]) {
dis[v] = dis[u] + w;
cnt[v] = cnt[u] + 1;
if(cnt[v] >= n) return true;
if(!vis[v]) q[++tt] = v;
}
}
}
return false;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", f + i);
for (int i = 1, u, v, w; i <= m; i++) {
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
}
double l = 0, r = 1000, eps = 1e-4;
while(r - l > eps) {
double mid = (l + r) / 2;
if(check(mid)) l = mid;
else r = mid;
}
printf("%.2lf\n", r);
return 0;
}
原文地址:https://www.cnblogs.com/dmoransky/p/11919144.html
- Oracle Data Guard延迟的原因(r11笔记第69天)
- 一个细小的空间问题触发的报警(r11笔记第68天)
- MySQL误操作数据恢复的简单实践(r11笔记第67天)
- Oracle 12c中JOB运行失败的简单处理(r11笔记第66天)
- MySQL中的半同步复制(r11笔记第65天)
- Linux系统LVM逻辑卷创建过程以及自动化脚本
- 一个闪回区报警的数据恢复(r11笔记第62天)
- 利用腾讯云COS云对象存储定时远程备份网站
- 分享一个自写的Python远程命令和文件(夹)传输类
- Oracle数据误操作全面恢复实战(r11笔记第78天)
- 远程协助解决异常宕库的问题(r11笔记第75天)
- Nginx-helper纯代码版,文章评论发布自动清理Fastcgi缓存
- MySQL和Oracle行值表达式对比(r11笔记第74天)
- 闪回数据库不是“万金油”(r11笔记第73天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法