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

2023-11-22 02:04

本文主要是介绍观光奶牛 (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;
}

这篇关于观光奶牛 (01分数规划、负环)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/406693

相关文章

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

poj 3259 最短路负环

John的农场里N块地,M条路连接两块地,W个虫洞,虫洞是一条单向路,会在你离开之前把你传送到目的地,就是当你过去的时候时间会倒退Ts。我们的任务是知道会不会在从某块地出发后又回来,看到了离开之前的自己。简化下,就是看图中有没有负权环。有的话就是可以,没有的话就是不可以了。 import java.io.BufferedReader;import java.io.InputStream;

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

集中式版本控制与分布式版本控制——Git 学习笔记01

什么是版本控制 如果你用 Microsoft Word 写过东西,那你八成会有这样的经历: 想删除一段文字,又怕将来这段文字有用,怎么办呢?有一个办法,先把当前文件“另存为”一个文件,然后继续改,改到某个程度,再“另存为”一个文件。就这样改着、存着……最后你的 Word 文档变成了这样: 过了几天,你想找回被删除的文字,但是已经记不清保存在哪个文件了,只能挨个去找。真麻烦,眼睛都花了。看

轨迹规划-B样条

B样条究竟是干啥的?白话就是给出一堆点,用样条的方式,给这些点连接起来,并保证丝滑的。 同时B样条分为准均匀和非均匀,以下为准均匀为例。 参考链接1:https://zhuanlan.zhihu.com/p/50626506https://zhuanlan.zhihu.com/p/50626506 参考链接2: https://zhuanlan.zhihu.com/p/536470972h

PMBOK® 第六版 规划进度管理

目录 读后感—PMBOK第六版 目录 规划进度管理主要关注为整个项目期间的进度管理提供指南和方向。以下是两个案例,展示了进度管理中的复杂性和潜在的冲突: 案例一:近期,一个长期合作的客户因政策要求,急需我们为多家医院升级一个小功能。在这个过程中出现了三个主要问题: 在双方确认接口协议后,客户私自修改接口并未通知我们,直到催进度时才发现这个问题关于UI设计的部分,后台开发人员未将其传递给