观光奶牛 (01分数规划、负环)

01分数规划问题:类似于观光奶牛这个题中的,求的路径上的点权值和与边权值和的商最大最小。

当前问题的推到如下:

        该问题其实可以用二分图来解决, 在不断的二分答案中获取符合条件的最大值。然后问题就转化为如何是否存在和为mid的环。

        \sum f[i] / \sum t[i] > mid  判断路径上点权和与边权和的商,是否大于mid;

        因为比权和为正,因此:

        \sum f[i] > mid * \sum t[i]  移项得:

        \sum f[i] - mid * \sum t[i] > 0  因为他们单项是对应的,所以两个求和可以进行合并,如下:

        \sum (f[i] - mid * t[i]) > 0

        至此可以发现,存在环上路径得权值为正数即可,即是否存在正环。

由上可以将问题转化为一个判断是否存在正环的问题,而判断正环则可以通过spfa来进行判断,spfa在走最短路得时候可以判断负环,走最长路得时候可以判断正环。

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
//#define x first
//#define y second
//#define int long long
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<int, string> pis;
const int mod = 1e9 + 7;
const int N = 1e6+ 10;
int dx[] = {-1, 0, 1, 0, -1, 1, 1, -1};
int dy[] = {0, 1, 0, -1, 1, 1, -1, -1};
int n, m;
int o[N];
int h[N], e[N], wf[N], wt[N], ne[N], idx;
bool st[N];
int cnt[N];
double dist[N];

inline void add(int a, int b, int c) {
	e[idx] = b, wt[idx] = c, ne[idx] = h[a], h[a] = idx ++;
}

int check(double mid) { // 该板子是用vector建的图,时间肯定没有邻接表快。直需要改一下建图方式即可。
	queue<int> yi;
	for(int i = 1; i <= n; i ++) // 初始化标记内容,不影响本次计算的时候使用
		dist[i] = st[i] = cnt[i] = 0;
	for(int i = 1; i <= n; i ++) { // 加入起点
		yi.push(i);
		st[i] = 1;
	}
	while(yi.size()) {
		int t = yi.front();
		yi.pop();
		st[t] = 0;
		for(int i = h[t]; ~i; i = ne[i]) {
			int j = e[i];
			if(dist[j] < dist[t] + wf[t] - mid * wt[i]) { 
				dist[j] = dist[t] + wf[t] - mid * wt[i]; // 更新状态
				cnt[j] = cnt[t] + 1; 
				if(cnt[j] >= n) return 1; // 该图中点大于等于n,则存在环。
				if(!st[j]) {
					yi.push(j);
					st[j] = 1;
				}
			}
		}
	}
	return 0;
}


inline void sovle() {
	cin >> n >> m;
	memset(h, -1, sizeof h);
	
	for(int i = 1; i <= n; i ++ ) cin >> wf[i]; // 记录点权值
	while(m --) { // 建图并且记录边权值
		int a, b, c;
		cin >> a >> b >> c;
		add(a, b, c);
	}

	double l = 0, r = 1010;
	while(r - l > 1e-4) { // 二分获得答案
		double mid = (l + r) / 2;
		if(check(mid)) l = mid; 
		else r = mid;
	}
	cout << fixed << setprecision(2) << l << endl; // cout输出两位小数,加速流不能使用scanf
}

signed main(void) {
	IOS;
	int t = 1;
//	cin >> t;
	while(t --) sovle();
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux之chmod命令

在linux系统中经常遇到需要对文件修改读写执行的权限&#xff0c;下面对chomod命令进行梳理总结。 1、文件权限 在linux系统中&#xff0c;每个文件都有归属的所有者和所有组&#xff0c;并且规定了文件的所有者、以及其他人对文件所拥有的可读&#xff08;r&#xff09;、可写…

线程(线程基本概念、java实现多线程、使用多线程、线程的生命周期、线程同步、线程死锁)

&#xff08;一&#xff09;线程基本概念 一、 程序, 进程, 线程的概念 程序: 使用某种语言编写一组指令(代码)的集合,静态的 进程: 运行的程序,表示程序一次完整的执行, 当程序运行完成, 进程也就结束了 个人电脑: CPU 单个, 双核, CPU的时间分片, 抢占式 每个独立执行的程…

整套数字化招采平台安全防御体系

招采平台作为数字化供应链的重要组成部分&#xff0c;需要确保招标采购过程的安全性,主体信息和交易数据信息尤为重要,通过必要的安全架构、技术和安全管理制度&#xff0c;做到事前防范、事中监管和事后审计的安全防御。 一、平台技术安全架构 1、先进的技术架构&#xff0c…

算法设计与分析复习--回溯(一)

文章目录 上一篇回溯法性质子集和问题装载问题下一篇 上一篇 算法设计与分析复习–贪心&#xff08;二&#xff09; 回溯法性质 类似穷举的搜索尝试过程&#xff0c;在搜索尝试过程中寻找问题的解&#xff0c;组织得井井有条&#xff08;避免遗漏&#xff09;&#xff0c; 高…

KNN(k近邻法)算法理论和实战

KNN概念 k近邻法&#xff08;k-nearest neighbor&#xff0c;k-NN&#xff09;是一种基本分类与回归方法。 k近邻法的输入为实例的特征向量对应于特征空间的点&#xff1b;输出为实例的类别&#xff0c;可以取多类。 k近邻法假设给定一个训练数据集&#xff0c;其中的实例类…

【机器学习】039_合理初始化

一、稳定训练 目标&#xff1a;使梯度值在更合理的范围内 常见方法如下&#xff1a; 将乘法变为加法 ResNet&#xff1a;当层数较多时&#xff0c;会加入一些加法进去 LSTM&#xff1a;如果时序序列较长时&#xff0c;把一些对时序的乘法做加法 归一化 梯度归一化&…

全链路压测的步骤及重要性

全链路压测是一种系统性的性能测试方法&#xff0c;旨在模拟真实用户场景下的完整操作流程&#xff0c;全面评估软件系统在不同压力下的性能表现。这种测试方法对于保证应用程序的高可用性、稳定性和可扩展性至关重要。 1. 全链路压测概述 全链路压测是在模拟实际用户使用场景的…

SMU可以供电的同时测量电流和电压

SMU可以供电的同时测量电流和电压 SMU本身能够提供电流或电压&#xff0c;同时测量负载或被测设备&#xff08;DUT&#xff1a;Device Under Test&#xff09;上的电流和电压。这是与传统电源相比使用SMU的优势之一。 SMU测量的电流和电压值将反映在NI-DCPower软面板中&#…

(swjtu西南交大)数据库实验(数据库需求分析):音乐软件数据管理系统

实验内容&#xff1a; 数据库需求分析&#xff1a;各用户组需求描述&#xff0c;绘出数据流图&#xff08;详细案例参见教材p333~p337&#xff0c;陶宏才&#xff0c;数据库原理及设计&#xff0c;第三版&#xff09;&#xff1b; 一、选题背景 近年来&#xff0c;“听歌”逐…

【docker】虚拟化和docker容器概念

基础了解 IAAS&#xff1a; 基础设施服务&#xff0c;&#xff08;只提供基础设施&#xff0c;没有系统&#xff09; **SAAS&#xff1a; ** 软件即服务&#xff0c;&#xff08;提供基础设施和系统&#xff09; PAAS&#xff1a; 平台即服务&#xff0c;&#xff08;提供基…

【Docker】从零开始:1.Docker概述

【Docker】从零开始&#xff1a;1.Docker概述 1.什么是Docker2.为什么要使用Docker3.传统虚拟机技术与Linux容器技术的区别(1).传统虚拟机技术(2).Linux容器 4.Docker的特点一次构建、随处运行a.更快速的应用交付和部署b.更便捷的升级和扩缩容&#xff1a;c.更简单的系统运维d.…

三字经||无聊数了下三字经的字数

三字经总字数去除标点后1416个 该文章无技术含量&#xff0c;仅三字经原文&#xff0c;学技术的同学可以止步了 三字经&#xff08;原文&#xff09; 【作者】王应麟 【朝代】南宋 人之初&#xff0c;性本善。性相近&#xff0c;习相远。 苟不教&#xff0c;性乃迁。教之道&a…

视频接入网关的用法

视频接入网关是一种多功能的视频网关设备&#xff0c;可以解决各种视频接入&#xff0c;视频输出&#xff0c;视频转码&#xff0c;视频融合的问题。可以应用在应急指挥&#xff0c;智慧融合等项目中&#xff0c;与各种系统进行对接&#xff0c;解决视频能力跨系统集成的难题。…

matlab-BP神经网络的训练参数大全

本文部分图文来自《老饼讲解-BP神经网络》bp.bbbdata.com 本文列兴趣MATLAB神经网络工具箱中&#xff0c;训练参数trainParam的各个参数与意义 以方便在使用matlab工具箱时&#xff0c;用于查阅 一、matlab神经网络工具箱trainParam的参数列表 trainParam中的各个具体参数如下…

【数据结构(三)】单链表(1)

文章目录 1. 链表介绍2. 单链表应用实例2.1. 顺序添加方式2.1.1. 思路分析2.1.2. 代码实现 2.2. 按照编号顺序添加方式2.2.1. 思路分析2.2.2. 代码实现 3. 单链表节点的修改3.1. 思路分析3.2. 代码实现 4. 单链表节点的删除4.1. 思路分析4.2. 代码实现 5. 单链表常见面试题5.1.…

代码随想录算法训练营|五十九~六十天

下一个更大元素|| 503. 下一个更大元素 II - 力扣&#xff08;LeetCode&#xff09; 和每日温度一样的套路&#xff0c;就是这里可以循环数组&#xff0c;两个数组拼接&#xff0c;然后循环两遍就行。 public class Solution {public int[] NextGreaterElements(int[] nums)…

Python如何实现模板方法设计模式?什么是模板方法设计模式?Python 模板方法设计模式示例代码

什么是模板方法&#xff08;Template Method&#xff09;设计模式&#xff1f; 模板方法&#xff08;Template Method&#xff09;是一种行为型设计模式&#xff0c;它定义了一个算法的骨架&#xff0c;将一些步骤延迟到子类中实现。这种模式允许子类为一个算法的特定步骤提供…

DeepStream--测试lpdnet车牌检测模型

模型地址&#xff1a;https://catalog.ngc.nvidia.com/orgs/nvidia/teams/tao/models/lpdnet/version 模型格式已经从加密的etlt格式变为onnx格式。这个模型用于从汽车图片上检测出车牌位置&#xff0c;模型有两个&#xff0c;一个用于美国车&#xff0c;一个用于中国车。 Nv…

Mysql之聚合函数

Mysql之聚合函数 什么是聚合函数常见的聚合函数GROUP BYWITH ROLLUPHAVINGHAVING与WHERE的对比 总结SQL底层原理 什么是聚合函数 对一组数据进行汇总的函数&#xff0c;但是还是返回一个结果 聚合函数也叫聚集&#xff0c;分组函数 常见的聚合函数 1.AVG(): 求平均值 2.SUM() :…