图论(01分数规划+负环spfa)P2868 [USACO07DEC] Sightseeing Cows G

news/2025/3/1 18:05:09/文章来源:https://www.cnblogs.com/SamXia/p/18745240

题目描述

给你一张 \(n\)\(m\) 边的有向图,第 \(i\) 个点点权\(F_{i}\),第 \(i\) 条边边权\(T_{i}\)

找一个环,设环上的点组成的集合为 \(S\),环的边组成的集合为 \(E\),最大化\( \frac{\sum_{u \in S}F_{u}} {{\sum_{e \in E} T_{e}}}\)的值

思路分析

先给一个显而易见的小结论:任意一个环中的点数和边数一定相等 我们假设有\(m\)

接着假设最大答案为\(ans\)

\[ans\geq \frac{\sum_{i}^m F_{i}}{\sum_{i}^m T_{i}} \]

移项,

\[ans \times {\sum_{i}^m T_{i}} \geq {\sum_{i}^m F_{i}} \]

运用乘法分配律,

\[{\sum_{i}^m (T_{i}\times ans)} \geq {\sum_{i}^m F_{i}} \]

移项,使用加(减)法交换结合律,

\[{\sum_{i}^m (T_{i}\times ans-F_{i}) }\geq 0 \]

得到结论:答案 \(ans\)\({\sum_{i}^m (T_{i}\times ans-F_{i}) }\geq 0\)条件下合法 求解最大的\(ans\)

我们把\({\sum_{i}^m (T_{i}\times ans-F_{i}) }\)设为\(f(ans)\) 得到\(f(ans)\)为增函数

尝试二分\(ans\) \((ans \in [10^{-3},10^3])\)

  • case 1:\(f(ans)<0\) 不满足\(ans\)的条件 应增大\(ans\)的值 (代码l=mid)
  • case2:\(f(ans)\geq 0\)满足\(ans\)的条件 应减小\(ans\)的值(代码r=mid)

由此可以打出\(01\)分数规划二分的板子:

    double l=0.001,r=1000;double mid;while(r-l>0.0001){mid=(l+r)/2.0;if(check(mid)<0) l=mid;else r=mid;}

想一想怎么打\(check()\)函数

考虑\(f(ans)<0\)\({\sum_{i}^m (T_{i}\times ans-F_{i}) }< 0\)

因为要求选的点形成一个环 而\({\sum_{i}^m (T_{i}\times ans-F_{i}) }\)值又为负数 可以很显然想到负环算法

我们给每条边重新赋值边权 对于任意边\([u,v]\)边权赋值为\(w[u][v]\times ans-F_u\)

那么判断负环的公式就是\({\sum_{i}^m (T_{i}\times ans-F_{i}) }< 0\)\(f(ans)<0\)

这样就实现了用负环算法完成\(check\)函数

代码实现

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=5e3+10;
int f[N];
struct edge
{int v,w;
};
vector<edge> e[N];
int num[N];
double dis[N];
bool vis[N];
int n,m;
bool spfa(double ans) 
{queue<int> q;memset(num,0,sizeof(num));memset(vis,0,sizeof(vis));memset(dis,0,sizeof(dis));for(int i=1;i<=n;++i) {q.push(i);vis[i]=1;}while(!q.empty()) {int u=q.front();q.pop();vis[u]=0;for(int i=0;i<e[u].size();++i){int v=e[u][i].v;double w=e[u][i].w;w=w*ans-f[u];//重新赋值边权if(dis[v]>dis[u]+w){dis[v]=dis[u]+w;num[v]=num[u]+1;if(num[v]>=n) return 1;if(!vis[v]) {q.push(v);vis[v]=1;}}}}return 0;
}
signed main()
{ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n>>m;for(int i=1;i<=n;++i)cin>>f[i];for(int i=1;i<=m;++i){int u,v,w;cin>>u>>v>>w;e[u].push_back({v,w});}double l=0.001,r=1000;double mid;while(r-l>0.0001){mid=(l+r)/2.0;if(spfa(mid)) l=mid;else r=mid;}printf("%.2lf",mid);return 0;
}

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

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

相关文章

三剑客与正则系列-正则表达式

1.注意事项正则符号都是英文符号,避免使用中文符号 推荐使用grep/egrep命令,默认设置了别名,自动加上颜色 http://nbre.oldboylinux.cn/ 分析正则与正则匹配到的内容. 其他坑.# "" . #‘’ ”“ 。alias grep=grep color=auto alias egrep=egrep color=auto2.符号概述…

【凸优化笔记2】-凸函数、下水平集、范数

转自:https://zhuanlan.zhihu.com/p/102098039 1. 凸函数 1.1 凸函数定义 一个函数𝑓:𝑅𝑛→𝑅是凸的,如果定义域𝑑𝑜𝑚𝑓是凸集,并且对于所有𝑥,𝑦∈𝑑𝑜𝑚𝑓,𝜃∈[0,1],都有: 𝑓(𝜃𝑥+(1−𝜃)𝑦)≤𝜃𝑓(𝑥)+(1−𝜃)𝑓…

使用AI后为什么思考会变得困难?

使用AI后为什么思考会变得困难? 我总结了四篇近期的研究论文,来展示AI是如何以及为什么侵蚀我们的批判性思维能力。作者使用AI制作的图像前言:作者在这篇文章中,借AI技术的崛起,揭示了一场悄然发生的思想博弈。表面上,AI为我们带来了前所未有的效率与便捷,但在无形之中,…

44页太阳花绘制

点击查看代码 from turtle import * color(red, yellow) begin_fill() while True:forward(200)left(170)if abs(pos()) < 1:break end_fill() done()

leetcode hot 15

解题思路:思路还是比较清晰,先按照起始位置排序,然后再逐个遍历,根据起始位置与前一个结束位置进行比较,两种情况进行处理即可(这边代码比较麻烦因为前面list泛型用错了) import java.util.Arrays; class Solution {public int[][] merge(int[][] intervals) {List<Lis…

WgelCTF打靶笔记(2)

参考视频:https://www.bilibili.com/video/BV1itwgeHEEk/?spm_id_from=333.1387.upload.video_card.click&vd_source=e948147c25027ef3216b5c376b31fc96扫描dirb: 发现.ssh有一个id_rsa文件,即ssh连接私钥,右键下载到本地 ssh私钥: SSH:用于安全的连接到远程服务器 …

44页五角星绘制

点击查看代码 from turtle import * fillcolor("red") begin_fill() while True:forward(200)right(144)if abs(pos()) < 1:break end_fill()

Go1.24版本终于来了!各位开发者,准备好迎接这些激动人心的新功能了吗?让我们一起来探讨下Go1.24中有哪些精彩的亮点?

前言 Gopher们,Go 1.24.0 正式发布了!与 Go 1.23.0 相比,这个版本带来了众多改进。让我们一同看看 Go 1.24.0 都有哪些新变化吧! 在 Windows 下,请在 https://github.com/voidint/g/releases 下载适合您系统的版本。例如,如果您的系统是 64 位的,可以下载 g1.7.0.window…

FastAPI极速入门:15分钟搭建你的首个智能API(附自动文档生成)

title: FastAPI极速入门:15分钟搭建你的首个智能API(附自动文档生成)🚀 date: 2025/3/1 updated: 2025/3/1 author: cmdragon excerpt: 用虚拟环境打造纯净开发空间的3种方法 只需5行代码实现智能API端点 自动生成媲美大厂的交互式API文档 解决新手必踩的9大坑点(含依赖…

rocketmq不同服务使用相同消费者组和生产者组的问题

之前多个服务使用同一个消费者组和生产者组procfg-consumer-group和procfg-produce-group,然后共享同一个Topic。 时不时会有问题,例如主控服务版本更新之后虽然消息发出来了,但是终端接收不到,消息有时会有CONSUMED_BUT_FILTERED(被过滤)个人理解的原因是多个服务用同一个…

用python画了一个五星红旗

点击查看代码 import turtle# 设置屏幕 screen = turtle.Screen() screen.bgcolor("white") screen.setup(width=800, height=600) # 设置窗口大小# 设置画笔 pen = turtle.Turtle() pen.speed(10) pen.penup()# 绘制红旗背景 def draw_rectangle(color, width, hei…

gitlab使用自建nginx反向代理

参考文档:https://www.cnblogs.com/suruozhong/p/12468167.html 一、修改配置文件 vim /etc/gitlab/gitlab.rb# 让gitlab的内置nginx监听9002端口 nginx[listen_port] = 9002# 设置gitlab的访问路径(是通过外部nginx反向代理访问的) external_url http://域名/git例如: # 让…