【HNOI2009】最小圈 题解(SPFA判负环+二分答案)
前言:模拟赛考试题,不会做,写了个爆搜滚蛋仍然保龄。
---------------------
题目大意:给定一张有向图,求一个环,使得这个环的长度与这个环的大小(所含结点个数)的比值最小。输出这个比值,保留8位小数。保证数据有解。
---------------------
转化一下题意。要求是使得$C=\frac{\sum\limits_{i=1}^k w[i]}{\sum\limits_{i=1}^k b[i]},b[i]=1$最小。等式变换,得到$\sum\limits_{i=1}^k w[i]-C=0$。我们可以二分这个$C$然后判断有没有负环即可。
貌似看题解是$01$分数规划,我也不太懂。理论上复杂度是$O(nm\log_2 (r-l))$,不过因为算法比较高效也能卡过去。
代码:
- #include<bits/stdc++.h>
- using namespace std;
- const int maxn=;
- const double eps=1e-;
- int n,m,vis[maxn];
- int head[maxn*],cnt;
- struct node
- {
- int next,to;
- double dis;
- }edge[maxn*];
- double dis[maxn];
- inline void add(int from,int to,double dis)
- {
- edge[++cnt].next=head[from];
- edge[cnt].to=to;
- edge[cnt].dis=dis;
- head[from]=cnt;
- }
- inline bool spfa(int now,double mid)
- {
- vis[now]=;
- for (int i=head[now];i;i=edge[i].next)
- {
- int to=edge[i].to;
- if (dis[to]>dis[now]+edge[i].dis-mid)
- {
- dis[to]=dis[now]+edge[i].dis-mid;
- if (vis[to]||spfa(to,mid)) return ;
- }
- }
- vis[now]=;
- return ;
- }
- inline bool check(double mid)
- {
- for (int i=;i<=n;i++) dis[i]=,vis[i]=;
- for (int i=;i<=n;i++) if (spfa(i,mid)) return ;
- return ;
- }
- int main()
- {
- cin>>n>>m;
- for (int i=;i<=m;i++)
- {
- int x,y;double z;cin>>x>>y>>z;
- add(x,y,z);
- }
- double l=-1e7,r=1e7;
- while(r-l>eps)
- {
- double mid=(l+r)/2.0;
- if (check(mid)) r=mid;
- else l=mid;
- }
- printf("%.8lf",r);
- return ;
- }
【HNOI2009】最小圈 题解(SPFA判负环+二分答案)的更多相关文章
- [APIO2017]商旅——分数优化+floyd+SPFA判负环+二分答案
题目链接: [APIO2017]商旅 枚举任意两个点$(s,t)$,求出在$s$买入一个物品并在$t$卖出的最大收益. 新建一条从$s$到$t$的边,边权为最大收益,长度为原图从$s$到$t$的最短路 ...
- 【题解】 [HNOI2009] 最小圈 (01分数规划,二分答案,负环)
题目背景 如果你能提供题面或者题意简述,请直接在讨论区发帖,感谢你的贡献. 题目描述 对于一张有向图,要你求图中最小圈的平均值最小是多少,即若一个圈经过k个节点,那么一个圈的平均值为圈上k条边权的和除 ...
- [HNOI2009]最小圈 分数规划 spfa判负环
[HNOI2009]最小圈 分数规划 spfa判负环 题面 思路难,代码简单. 题目求圈上最小平均值,问题可看为一个0/1规划问题,每个边有\(a[i],b[i]\)两个属性,\(a[i]=w(u,v ...
- 2018.09.24 bzoj1486: [HNOI2009]最小圈(01分数规划+spfa判负环)
传送门 答案只保留了6位小数WA了两次233. 这就是一个简单的01分数规划. 直接二分答案,根据图中有没有负环存在进行调整. 注意二分边界. 另外dfs版spfa判负环真心快很多. 代码: #inc ...
- BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划
BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划 更清真的题面链接:https://files.cnblogs.com/files/winmt/merchant%28zh_ ...
- [P1768]天路(分数规划+SPFA判负环)
题目描述 “那是一条神奇的天路诶~,把第一个神犇送上天堂~”,XDM先生唱着这首“亲切”的歌曲,一道猥琐题目的灵感在脑中出现了. 和C_SUNSHINE大神商量后,这道猥琐的题目终于出现在本次试题上了 ...
- [poj3259]Wormholes(spfa判负环)
题意:有向图判负环. 解题关键:spfa算法+hash判负圈. spfa判断负环:若一个点入队次数大于节点数,则存在负环. 两点间如果有最短路,那么每个结点最多经过一次,这条路不超过$n-1$条边. ...
- BZOJ 1715: [Usaco2006 Dec]Wormholes 虫洞 DFS版SPFA判负环
Description John在他的农场中闲逛时发现了许多虫洞.虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前).John的每个农场有M条小路(无向边)连接着N ...
- [HNOI2009]最小圈 题解
题目大意 给你一个有向图,求出图中环的平均值的最小值 环的平均值定义:环中所有的边权和/环中点数量 思路 看到使平均值最大或最小,可以考虑分数规划 分数规划用于解决一些要让平均值最大或最小的问题 具体 ...
随机推荐
- 真懂Spring的@Configuration配置类?你可能自我感觉太良好
当大潮退去,才知道谁在裸泳.关注公众号[BAT的乌托邦]开启专栏式学习,拒绝浅尝辄止.本文 https://www.yourbatman.cn 已收录,里面一并有Spring技术栈.MyBatis.中 ...
- Qt-文件系统
1 简介 参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=45 参考文档:<Qt教程.docx> 说明:本文主要介绍Qt的文件系统. ...
- JVM 专题一:虚拟机(一)
1. 虚拟机 1.1 什么是虚拟机? 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统. 所谓虚拟机,就是一台虚拟的计算机.它是 ...
- 数据可视化实例(六): 带线性回归最佳拟合线的散点图(matplotlib,pandas)
https://datawhalechina.github.io/pms50/#/chapter3/chapter3 如果你想了解两个变量如何相互改变,那么最佳拟合线就是常用的方法. 下图显示了数据中 ...
- css 实现动态二级菜单
动态实现简单的二级菜单 当鼠标放到一级标签上时,鼠标会变成小手的形状 展示二级菜单,源码如下,复制即可直接使用 <!DOCTYPE html> <html lang="en ...
- Unity3D Demo项目开发记录
前言 经过一段时间的学习与实际开发,unity3D也勉强算是强行入门了,正所谓好记性不如烂笔头,更何况本人并非专业从事unity3D开发,会一点C#但也并不熟悉,为了避免后期遗忘,因此特意整理了一个D ...
- 软件测试工程师应该怎样规划自己?成为年薪30W+测试工程师(乾坤未定,皆是黑马)
今天在知乎上被邀了一个问题,软件测试工程师应该怎样规划自己?16年毕业,技术方面已经渣到不行,因为之前的公司没有Python自动化测试这个要求,有些迷茫.我把我的问题回答贴出来希望可以帮助到更多有类型 ...
- vue : 项目起手式 - router组件通用模板
每次新建文件都要找来找去,麻烦,干脆贴到这里好了. <template> <div id="page"> </div> </templat ...
- 【JVM之内存与垃圾回收篇】程序计数器
程序计数器 介绍 JVM 中的程序计数寄存器(Program Counter Register)中,Register 的命名源于 CPU 的寄存器,寄存器存储指令相关的现场信息.CPU 只有把数据装载 ...
- ES6面试
未完持续 概念 ECMAScript6(以下简称ES6)是 JavaScript 语言的下一代标准,前者是后者的规格,后者是前者的一种实现. ES6(新增的)一些特性 1.变.常量:let声明变量,c ...