每周算法:01分数规划

题目链接

观光奶牛

题目描述

给定一张 N N N 个点、 M M M 条边的有向图,每个点都有一个权值 p i p_i pi,每条边都有一个权值 w i w_i wi

求图中的一个环,使“环上各点的权值之和”除以“环上各边的权值之和”最大

输出这个最大值。

注意:数据保证至少存在一个环。

输入格式

第一行包含两个整数 N N N M M M

接下来 N N N 行每行一个整数,表示 p i p_i pi

再接下来 M M M 行,每行三个整数 a a a b b b w [ i ] w[i] w[i],表示点 a a a b b b 之间存在一条边,边的权值为 w i w_i wi

输出格式

输出一个数表示结果,保留两位小数。

样例 #1

样例输入 #1

5 7
30
10
10
5
10
1 2 3
2 3 2
3 4 5
3 5 2
4 5 5
5 1 3
5 2 2

样例输出 #1

6.00

提示

【数据范围】

2 ≤ N ≤ 1000 2≤N≤1000 2N1000,
2 ≤ M ≤ 5000 2≤M≤5000 2M5000,
1 ≤ p i , w i ≤ 1000 1≤p_i,w_i≤1000 1pi,wi1000

算法思想

根据题目描述,求的是图中的一个环,使“环上各点的权值之和”除以“环上各边的权值之和”最大,不妨设即环上各点的权值之和为 ∑ p i \sum p_i pi,各边的权值之和为 ∑ w i \sum w_i wi,即求 ∑ p i ∑ w i \frac{\sum p_i}{\sum w_i} wipi的最大值。这种解决“最优比率” 的问题,可以使用「01分数规划」。

01分数规划 :01指取还是不取,分数即所求型式为 a b \frac{a}{b} ba,规划就是选取最好的方案。

01分数规划一般采用二分答案的方式求解。对于本题来说,即求是否存在 m i d mid mid使环上各点的权值之和除以环上各边的权值之和大于 m i d mid mid,即 ∑ p i ∑ w i > m i d \frac{\sum p_i}{\sum w_i}>mid wipi>mid,进一步整理可得: ∑ p i − m i d × ∑ w i > 0 \sum p_i-mid\times \sum w_i>0 pimid×wi>0

其中, p i p_i pi表示节点 i i i的权值,为了方便处理,可以将节点的边权累加到该节点的出边上,那么不等式可以进一步转变为:
∑ ( p i − m i d × w i ) > 0 \sum ({p_i-mid\times w_i})>0 (pimid×wi)>0

那么,要判断在包含环的图中是否存在 m i d mid mid,使环上各点的权值之和除以环上各边的权值之和大于 m i d mid mid,就等价于判断当图中边权为 p i − m i d × w i {p_i-mid\times w_i} pimid×wi时,是否存在正权环

而判断是否存在正权环可以使用「SFPA」算法,基本思想与判断负环稍有不同。判断负环可以参考博主的另一篇文章:每周一算法:负环判断。判断正权环时:

  • 要求最长路,即 d [ v ] < d [ u ] + w d[v] < d[u] + w d[v]<d[u]+w时,更新 v v v点到起点的最长路;
  • v v v点到起点的最长路被更新时,累加最长路中包含的边数,即 c n t [ v ] = c n t [ u ] + 1 cnt[v]=cnt[u]+1 cnt[v]=cnt[u]+1
  • 如果边数 c n t [ v ] > = n cnt[v]>=n cnt[v]>=n,说明图中存在正权环。

时间复杂度

本题中的01分数规划在二分答案的过程中,需要用SPFA算法判断正权环,时间复杂度为 O ( k M l o g W ) O(kMlogW) O(kMlogW),其中 k k k是常数, M M M为边数, W W W为边权之和。

代码实现

#include <bits/stdc++.h>
using namespace std;
const int N = 1005, M = 5005;
int h[N], e[M], w[M], ne[M], idx;
int n, m;
int p[N], q[N], cnt[N];
double d[N];
bool st[N];
void add(int a, int b, int c)  // 添加一条边a->b,边权为c
{e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}bool check(double mid) //spfa判断是否存在正权环
{memset(d, 0, sizeof d); //求最长路,初始化为0memset(st, 0, sizeof st);memset(cnt, 0, sizeof cnt);int hh = 0, tt = 0; //将所有点加入队列for(int i = 1; i <= n; i ++) { q[tt ++] = i, st[i] = true; }while(hh != tt) {int u = q[hh ++];if(hh == N) hh = 0; //循环队列st[u] = false;for(int i = h[u]; ~ i; i = ne[i]){int v = e[i];if(d[v] < d[u] + p[u] - mid * w[i]){d[v] = d[u] + p[u] - mid * w[i];cnt[v] = cnt[u] + 1;if(cnt[v] >= n) return true;if(!st[v]) {q[tt ++] = v, st[v] = true;if(tt == N) tt = 0;}}}}return false;
}
int main()
{cin >> n >> m;for(int i = 1; i <= n; i ++) cin >> p[i];memset(h, -1, sizeof h);while(m --){int a, b, c;cin >> a >> b >> c;add(a, b, c);}double L = 0, R = 1e6;while(R - L > 1e-4){double mid = (L + R) / 2;if(check(mid)) L = mid;else R = mid;}printf("%.2lf\n", L);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/848120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【运维项目经历|029】NTP精准时间同步系统优化项目

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专家博主 💊交流社区:CSDN云计算交流社区欢迎您的加入! 目

YOLOv8+PyQt5非洲动物检测(可以重新训练,yolov8模型,从图像、视频和摄像头三种路径识别检测)

效果视频&#xff1a;非洲动物检测yolo检测&#xff08;https://mbd.pub/o/bread/mbd-ZpaYk51q&#xff09;_哔哩哔哩_bilibili 资源包含可视化的非洲动物检测系统&#xff0c;基于最新的YOLOv8训练的非洲动物检测模型&#xff0c;和基于PyQt5制作的可视化非洲动物检测系统&am…

免费的维吾尔语翻译器:维汉翻译通App,最近新增了什么功能呢?让我们一起来看看!好用的维语翻译工具支持语音评分功能、支持汉语查拼音等等。

“阿拉伯语是知识&#xff0c;波斯语是糖&#xff0c;印度语是盐&#xff0c;而维吾尔语则是艺术。” 这是一句流传在西域的古老谚语&#xff0c;它不仅道出了维吾尔语言的独特魅力&#xff0c;也表达了人们对语言艺术的无限热爱。 而今&#xff0c;我们带着这份热爱&#x…

厉害了!ATFX登上南非主流报刊《The Citizen》头条

时隔三个月后&#xff0c;ATFX再次登上国际知名报刊头版头条&#xff0c;并迅速成为各大媒体关注焦点。继1月强势登陆《日本时报》经济与商业版面&#xff0c;2月在中东知名媒体CNBC Arabia留下深刻印记后&#xff0c;5月ATFX受邀参展2024年南非峰会并接受媒体采访见证了品牌的…

【成品设计】基于物联网的停车管理系统设计与实现

《基于物联网的停车管理系统设计与实现》 整体功能&#xff1a; 本次课题中&#xff0c;主要设计的是一款基于物联网技术的校园停车的管理系统&#xff0c;该系统能更方便得让管理员对停车场进行管理&#xff0c;同时也能够满足和方便用户使用。针对此种现象&#xff0c;就需…

MotionEditor_ 通过内容感知扩散编辑视频运动

图1. MotionEditor&#xff1a;一种基于扩散的视频编辑方法&#xff0c;旨在将参考视频的运动转移到源视频中。 摘要 现有的基于扩散的视频编辑模型在随时间编辑源视频的属性方面取得了显著进展&#xff0c;但在修改运动信息的同时保持原始主角的外观和背景方面存在困难。为…

一个简单的方式看看MySQL的锁

突然发现半个月没写了。最近事情太多了。 在日常工作的处理问题的过程中&#xff0c;我发现了一个简单的论证锁的问题&#xff0c;以前我讲的有点复杂&#xff0c;看来应该去改改之前的讲法了。 首先构造一个无主键无索引的表。并且初始化5条数据。 场景A&#xff1a; RR隔离…

开发环境无法网络连接Webservice情况下用winform程序连接

虽然现在通常用http做接口&#xff0c;但是还是有一部分是需要连之前的一些老项目用WEBSERVICE开发的接口的。网上一些介绍的大都是都是在开发环境下能够连上WEBSERVICE的情况下的做法。但是当开发环境不能直接连上WEBSERVICE服务器的情况下应该怎么做呢&#xff1f;以下就以wi…

新手又该如何操作呢?操作时候注意哪些问题?

第一条&#xff0c;止损&#xff1a;当你在下单前&#xff0c;就应该想好止损价是多少 &#xff0c;止损价格是不是合理&#xff0c;下单以后&#xff0c;马上把止损价填上&#xff0c;为什么么要一开始就要填止损&#xff0c;就是如果行情不是你希望走的情 况&#xff0c;这样…

Selenium自动化测试入门:设置等待时间

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 time.sleep(3) 固定等待3秒 driver.implicitly_wait(10) 隐性的等待&#xff0c;对应全局 WebD…

MyBatis框架——快速入门

MyBatis 是一款优秀的持久层框架&#xff0c;用于简化JDBC开发 MyBatis 本是Apache 的一个开源项目iBatis,2010年这个项目由apache softwarefoundation 迁移到了google code&#xff0c;并且改名为MyBatis 。2013年11月迁移到Github 官网: https://mybatis.org/mybatis-3/zh/…

图像热点链接

指定图片某块区域加超链接 &#xff1a;使用map标签可以给指定图片某块区域加超链接 使用方法&#xff1a; 例&#xff1a; <img src"../imgs/1.jpg" alt"" usemap"#map1" /> <map name"map1" id"map1"> …

Thread线程控制之sleep、join、setDaemon方法的用处

Thread线程控制之sleep、join、setDaemon方法的用处 sleep方法 public static void sleep(long millis) throws InterruptedException使当前正在执行的线程以指定的毫秒数暂停&#xff08;暂时停止执行&#xff09;&#xff0c;具体取决于系统定时器和调度程序的精度和准确性…

VUE解决跨域问题

一、什么是跨域 当在Vue应用中通过axios等工具发送HTTP请求时&#xff0c;如果请求的目标URL与当前页面的域名、协议、端口号不一致&#xff0c;就会触发浏览器的同源策略限制&#xff0c;导致跨域问题。 跨域问题是由浏览器引起的安全限制&#xff0c;而不是Vue框架本身导致…

记录搭建linux虚拟机学习jenkins自动化部署的全过程

安装虚拟机教程参考 https://juejin.cn/post/7250009145915719740?searchId2024060409134616191B1350EC8E073921 持续集成环境(1)-Jenkins安装 1&#xff09; 安装JDK Jenkins需要依赖JDK&#xff0c;所以先安装JDK1.8 yum install java-1.8.0-openjdk* -y 安装目录为&#…

HTTP相关面试题

1. HTPP基本概念 HTTP是超文本传输协议。本质上就是一个可以传输图片、视频、文字的计算机与计算机之间的协议 1.1. HTTP常见的状态码 2XX状态码: 主要用于表示已经服务器已经成功的处理了请求 [200 ok ]: 是最常见的状态码,表示我们请求成功且响应内容(响应头body)已经收到…

c# 开发的wpf程序闪退,无法用try catch捕获异常

之前开发的一个程序是c#wpf开发&#xff0c;基于.net framework 4.6.1的&#xff0c;一切都是正常的&#xff0c;但是在我重新装了win11后在程序logo出现后直接闪退&#xff0c;报错 返回值为 -1073740791 (0xc0000409)&#xff0c;而且定位到代码时发现是&#xff0c; publi…

【遂愿赠书 - 2期】:618火热来袭,网络安全书单推荐

文章目录 一、网络安全书单背景二、网络安全与编程实践书单2.1 &#x1f3f0;《内网渗透实战攻略》2.2 &#x1f6e1;️《Kali Linux高级渗透测试&#xff08;原书第4版&#xff09;》2.3 &#x1f396;️《CTF那些事儿》2.4 &#x1f680;《权限提升技术&#xff1a;攻防实战与…

kettle学习总结(1)

1&#xff0c;kettle下载 kettle本身是Java开发的开源项目&#xff0c;由于某种原因&#xff0c;目前官网已经不支持下载了&#xff0c;可到我的CSDN中下载 下载完后&#xff0c;还需要安装JDK环境以及对应的数据库驱动包&#xff0c;需要注意的是 该kettle的版本较低&#xff…

惠海H6212L 48V转12V 36V转12V 24V转5V DCDC降压恒压模块供电芯片方案

内置60V高压MOS&#xff1a;H6212L内置了60V耐压的MOS&#xff0c;这使得它能够承受48V的输入电压&#xff0c;从而适应更多的电源环境。 宽电压输入范围&#xff1a;支持8V至48V的宽压输入范围&#xff0c;满足了不同应用场景的电源需求。 输出电压可调&#xff1a;支持输出…