[USACO07DEC] Sightseeing Cows G(分数规划+负权回路判定)

题面

[USACO07DEC] Sightseeing Cows G - 洛谷

题目大意:

给出一张n点m边的带点权带边权的有向图

求一个回路使得路上点权和除以边权和最大(最优比率回路)

题解

首先一定仔细读题,是回路不是路径

由于回路上所有点权只能获取一次,但边权会获取很多次,所以最优解一定是简单回路(无重复边)

然后我们发现是让一个分数最大,于是我们可以考虑分数规划二分

假设二分的商为mid,判断是否存在一个满足点边权和比大于mid的回路,则二分判断条件为

\sum_{u\in V_p}valv[u]/\sum_{e\in E_p}vale[e]> mid(Vp为最优简单回路的点集,Ep为最优简单回路的边集)

稍微变换一下形式

\sum_{u\in V_p}valv[u]-mid*\sum_{e\in E_p}vale[e]> 0

这个判断条件依旧不好计算,因为我们二分的目的就是为了把最优化问题转换为判断性问题,但是对于该条件,我们除了枚举所有的简单回路,没有任何切入点

转念一想,最后这个大于0似乎暗藏玄机,又和回路联系在一起

不由得让人想到判断图是否存在正权回路(可以直接取相反数转化为判断负权回路)

为了把问题往这个方向转,我们尝试把点权下放到边权

\sum_{e=<u,v>\in E_p}-(valv[v]-mid*vale[e])< 0

把每条边边权设置为 -(它要通往的点的点权-mid*它原本的边权)

但是这样又会有一个新的问题,如果我们最后选出来的回路是这个样子

这样不就会重复计算点权了吗?

事实上这种情况是不存在的

我们可以感性的证明一下:

出现重复点的简单回路,一定可以拆解成若干初级回路(无重复点、无重复边)

整个回路最终的比率一定不会超过其中比率最大的初级回路((a+b)/(c+d)<=max(a/c,b/d),似乎在小学奥数里面叫糖水不等式?)(而且整个回路的比率的分子还会减去重复点的点权)

所以,我们选择一定是选择简单回路里面最优的初级回路

至此,我们就可以下放点权了

愉快地使用SPFA进行负权回路判断

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define N 1005
#define M 10005
#define INF 1000000000
int n,m;
int F[N];
struct enode{
	int u,v,w;
}E[M];
int fir[N],to[M],nxt[M],cnt;
double cd[M];
void adde(int a,int b,double c)
{
	to[++cnt]=b;cd[cnt]=c;nxt[cnt]=fir[a];fir[a]=cnt;
}
double dis[N];
int con[N];
bool inq[N];
queue<int> Q;
bool check()
{
	int i;
	for(i=1;i<=n;i++)dis[i]=INF;
	for(i=1;i<=n;i++)con[i]=0;
	for(i=1;i<=n;i++)inq[i]=0;
	for(i=1;i<=n;i++){
		if(dis[i]==INF){
			dis[i]=0;inq[i]=1;
			Q.push(i);
			while(!Q.empty()){
				int u=Q.front();Q.pop();inq[u]=0;
				for(int p=fir[u];p;p=nxt[p]){
					int v=to[p];
					double w=cd[p];
					if(dis[u]+w<dis[v]){
						dis[v]=dis[u]+w;
						con[v]++;
						if(!inq[v]){Q.push(v);inq[v]=1;}
						if(con[v]>=n)return 1;
					}
				}
			}
		}
	}
	return 0;
}
int main()
{
	int i;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
		scanf("%d",&F[i]);
	for(i=1;i<=m;i++)
		scanf("%d%d%d",&E[i].u,&E[i].v,&E[i].w);
	double l=0,r=1000,mid;
	while(r-l>1e-3){
		mid=(l+r)/2;
		cnt=0;
		for(i=1;i<=n;i++)fir[i]=0;
		for(i=1;i<=m;i++)
			adde(E[i].u,E[i].v,-(1.0*F[E[i].v]-mid*E[i].w));
		if(check())
			l=mid;
		else
			r=mid;
	}
	printf("%.2f",l);
}

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

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

相关文章

百万级单细胞多组学数据集成

写在前面 这是一篇粉丝来稿&#xff0c;文章题目为“Multi-omics integration in the age of million single-cell data”&#xff0c;于2021年发表于《Nature Reviews Nephrology》上&#xff0c;影响因子为42.439。由于单细胞目前快速的买入了百万级、多组学的时代&#xff…

upload-labs文件上传漏洞靶场练习

任意文件上传靶场upload-labs下载地址 文章目录 Pass-01- 前端JS校验绕过Pass-02- 文件类型MIME类型绕过Pass-03- 文件名后缀黑名单绕过Pass-04- .htaccess绕过Pass-05- 文件名后缀大写绕过Pass-06- 文件名后缀加空格绕过Pass-07- 文件名后缀加点绕过Pass-08-文件名后缀 ::$DAT…

Qt中XML文件创建及解析

一 环境部署 QT的配置文件中添加xml选项&#xff1a; 二 写入xml文件 头文件&#xff1a;#include <QXmlStreamWriter> bool MyXML::writeToXMLFile() {QString currentTime QDateTime::currentDateTime().toString("yyyyMMddhhmmss");QString fileName &…

【拾枝杂谈】从游戏开发的角度来谈谈原神4.0更新

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;结合最近的学习内容和以后自己的目标&#xff0c;今天又开了杂谈这个新坑&#xff0c;分享一下我在学习游戏开发的成长和自己的游戏理解&#xff0c;当然现在还是一枚…

C++------map和set的使用

文章目录 关联式容器键值对树型结构的关联式容器set的介绍map的介绍 关联式容器 什么是关联式容器&#xff1f;它与序列式容器有什么区别&#xff1f; 关联式容器也是用来存储数据的&#xff0c;与序列式容器不同的是&#xff0c;其里面存储的是<key&#xff0c;value>结…

UG\NX二次开发BlockUI 进入NX的BlockUI编辑界面

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 简介: 要使用BlockUI,需要先进入NX的BlockUI编辑界面。在低版本中,可以在Toolbar工具条中进入开始→所有应用模块→块UI样式编辑器;在高版本中,可以在Ribbon工具栏…

【数据结构】二叉数的存储与基本操作的实现

文章目录 &#x1f340;二叉树的存储&#x1f333;二叉树的基本操作&#x1f431;‍&#x1f464;二叉树的创建&#x1f431;‍&#x1f453;二叉树的遍历&#x1f3a1;前中后序遍历&#x1f4cc;前序遍历&#x1f4cc;中序遍历&#x1f4cc;后续遍历 &#x1f6eb;层序遍历&am…

Typora mac版本安装

提示&#xff1a;文章介绍&#xff0c;Typora在Mac系统中免费安装使用 文章目录 一、官网下载二、安装 一、官网下载 官网地址&#xff1a;https://www.typoraio.cn/ 二、安装 安装好后按 command 空格键&#xff0c;找到 Typora的安装路径 /Applications/Typora.app/Con…

计网(第四章)(网络层)(六)

目录 一、路由选择协议&#xff08;动态路由自动获取路由信息&#xff09;概述&#xff1a; 二、因特网采用的路由协议 主要特点&#xff1a; 1.自适应 2.分布式 3.分层次 因特网采用分层次的路由选择协议&#xff1a; 三、常见的路由选择协议 一、路由选择协议&#xff…

遇到 Binder这些面试题,你会怎么答?

作为开发人员&#xff0c;每个人都有每个人擅长领域&#xff0c;自然也有自己不擅长的领域&#xff0c;很难成为完美的一个全栈开发。在面试中最怕遇见的一件事是面试官专挑你不擅长的领域进行提问&#xff0c;目的就是看你遇到问题的应变能力。 接下给大家分享一个面试中容易被…

使用 Netty 实现群聊功能的步骤和注意事项

文章目录 前言声明功能说明实现步骤WebSocket 服务启动Channel 初始化HTTP 请求处理HTTP 页面内容WebSocket 请求处理 效果展示总结 前言 通过之前的文章介绍&#xff0c;我们可以深刻认识到Netty在网络编程领域的卓越表现和强大实力。这篇文章将介绍如何利用 Netty 框架开发一…

报错sql_mode=only_full_group_by

首发博客地址 https://blog.zysicyj.top/ 报错内容 ### The error may exist in file[D:\code\cppCode20221025\leader-system\target\classes\mapper\system\TJsonDataMapper.xml] ### The error may involve defaultParameterMap ### The error occurred while…

Haproxy+Keepalive 整合rabbitmq实现高可用负载均衡

Haproxy 实现负载均衡 HAProxy 提供高可用性、负载均衡及基于 TCPHTTP 应用的代理&#xff0c;支持虚拟主机&#xff0c;它是免费、快速并且可靠的一种解决方案&#xff0c;包括 Twitter,Reddit,StackOverflow,GitHub 在内的多家知名互联网公司在使用。HAProxy 实现了一种…

康希诺的再估值:市场到底,行业向上

生物医药是整个二级市场弹性数一数二&#xff0c;但拐点难以揣摩的行业。这一点&#xff0c;美港A三大市场都曾经有过足够多的暴涨暴跌案例可用于佐证。 但很多时候&#xff0c;这种片面的表现又掩盖了生物医药自身的永续价值&#xff1a;在绝大多数细分赛道上&#xff0c;任何…

加密的PDF文件,如何解密?

PDF文件带有打开密码、限制编辑&#xff0c;这两种密码设置了之后如何解密&#xff1f; 不管是打开密码或者是限制编辑&#xff0c;在知道密码的情况下&#xff0c;解密PDF密码&#xff0c;我们只需要在PDF编辑器中打开文件 – 属性 – 安全&#xff0c;将权限状态修改为无保护…

基于金枪鱼群算法优化的BP神经网络(预测应用) - 附代码

基于金枪鱼群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于金枪鱼群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.金枪鱼群优化BP神经网络2.1 BP神经网络参数设置2.2 金枪鱼群算法应用 4.测试结果&#xff1a;5…

链表(详解)

一、链表 1.1、什么是链表 1、链表是物理存储单元上非连续的、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表的指针地址实现&#xff0c;有一系列结点&#xff08;地址&#xff09;组成&#xff0c;结点可动态的生成。 2、结点包括两个部分&#xff1a;&#x…

Fedora Linux 的家族(一):官方版本

导读本文将对 Fedora Linux 官方版本进行更详细的介绍。共有五个 版本&#xff1a; Fedora Workstation、Fedora Server、Fedora IoT、Fedora CoreOS 和 Fedora Silverblue。Fedora Linux 下载页面目前显示其中三个为 官方 版本&#xff0c;另外两个为 新兴 版本。本文将涵盖所…

js的this指向问题

代码一&#xff1a; 这段代码定义了run函数、obj对象&#xff0c;然后我们把run函数作为obj的方法。 function run(){console.log(this);}let obj{a:1,b:2};obj.runrun;obj.run(); 那么我们调用obj的run方法&#xff0c;那么这个方法打印的this指向obj。 分析&#xff1a;即…