题目描述

样例输入

4 5
1 2 5
2 3 5
3 1 5
2 4 3
4 1 3

样例输出

3.66666667


题解

分数规划+Spfa判负环

二分答案mid,并将所有边权减去mid,然后再判负环,若有负环则调整下界,否则调整上界,直至上下界基本重合。

证明:显然

由于有(c+d)/(a+b+k)>(c+d)/(a+b)≥min(c/a,d/b),所以两个相交环形成的新环一定不是最优解,即答案一定是简单环。

如果存在环使得边权和/点数<mid,那么就有边权和<点数*mid。

又因为环中点数和边数相等,所以有边权和小于边数*mid,移项即得:存在负环。

这个时候需要调整上界,进一步更新答案;否则不存在则调整下界。

然后这道题的坑点:需要用dfs版Spfa判负环,据说bfs版会T,不明觉厉。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define eps 1e-9
#define N 3010
#define M 10010
using namespace std;
int n , m , head[N] , to[M] , next[M] , cnt , x[M] , y[M] , vis[N];
double len[M] , dis[N] , z[M];
void add(int x , int y , double z)
{to[++cnt] = y , len[cnt] = z , next[cnt] = head[x] , head[x] = cnt;
}
bool dfs(int x)
{int i;vis[x] = 1;for(i = head[x] ; i ; i = next[i]){if(dis[to[i]] > dis[x] + len[i]){dis[to[i]] = dis[x] + len[i];if(vis[to[i]]) return 1;if(dfs(to[i])) return 1;}}vis[x] = 0;return 0;
}
bool judge(double mid)
{int i;memset(head , 0 , sizeof(head));memset(vis , 0 , sizeof(vis));memset(dis , 0 , sizeof(dis));cnt = 1;for(i = 1 ; i <= m ; i ++ ) add(x[i] , y[i] , z[i] - mid);for(i = 1 ; i <= n ; i ++ ) if(dfs(i)) return 1;return 0;
}
int main()
{int i;double l = 100000000.0 , r = -100000000.0 , mid;scanf("%d%d" , &n , &m);for(i = 1 ; i <= m ; i ++ ) scanf("%d%d%lf" , &x[i] , &y[i] , &z[i]) , l = min(l , z[i]) , r = max(r , z[i]);while(l <= r){mid = (l + r) / 2;if(judge(mid)) r = mid - eps;else l = mid + eps;}printf("%.8lf\n" , (l + r) / 2);return 0;
}

转载于:https://www.cnblogs.com/GXZlegend/p/6855959.html

【bzoj1486】[HNOI2009]最小圈 分数规划+Spfa相关推荐

  1. bzoj千题计划227:bzoj1486: [HNOI2009]最小圈

    http://www.lydsy.com/JudgeOnline/problem.php?id=1486 二分答案 dfs版spfa判负环 #include<queue> #include ...

  2. [HNOI2009]最小圈 (二分答案+负环)

    题面:[HNOI2009]最小圈 题目描述: 考虑带权的有向图\(G=(V,E)\)以及\(w:E\rightarrow R\),每条边\(e=(i,j)(i\neq j,i\in V,j\in V) ...

  3. 【bzoj1690】[Usaco2007 Dec]奶牛的旅行 分数规划+Spfa

    题目描述 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的城市地图,上面标 ...

  4. bzoj2285 [SDOI2011]保密 分数规划spfa+最小割

    首先要发现起点相同的情况下,到其他点的最优路径也是相同的 所以就变成了求起点到n1个点的最优路径, 最优的方案是走过的边v1和/v2和最小 分数规划的标准形式 然后就可以二分+spfa(二分区间是0到 ...

  5. BZOJ3597 SCOI2014方伯伯运椰子(分数规划+spfa)

    即在总流量不变的情况下调整每条边的流量.显然先二分答案变为求最小费用.容易想到直接流量清空跑费用流,但复杂度略有些高. 首先需要知道(不知道也行?)一种平时基本不用的求最小费用流的算法--消圈法.算法 ...

  6. 【BZOJ】1690: [Usaco2007 Dec]奶牛的旅行(分数规划+spfa)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1690 第一题不是水题的题.. 分数规划.. T-T 百度吧..http://blog.csdn.ne ...

  7. POJ3621 Sightseeing Cows 分数规划 SPFA求最小环

    题意:给点数边数点权wi和边权ci,求一个环,使得∑wi / ∑ci最大. 解:分数规划,设ans为答案,则二分时边权设置为mid*ci - wi, 1.     易证明所求环一定为一个简单环,因为两 ...

  8. SCOI2014方伯伯运椰子 (分数规划+SPFA)

    题目描述 四川的方伯伯为了致富,决定引进海南的椰子树.方伯伯的椰子园十分现代化,椰子园中有一套独特的交通系统. 现在用点来表示交通节点,边来表示道路.这样,方伯伯的椰子园就可以看作一个有 n + 2 ...

  9. bzoj 1690: [Usaco2007 Dec]奶牛的旅行——分数规划+spfa判负环

    Description 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的城 ...

最新文章

  1. ubuntu下编译安装PHP
  2. 在Linux命令行下运行Matlab
  3. 酱油和gbt酱油哪个好_酱油不是越贵越好!找到这3个关键词,轻松避开勾兑酱油...
  4. php的cookie的函数,php setcookie()函数的使用简介
  5. Java异常(一) Java异常简介及其架构
  6. 机器学习之支持向量机SVM之python实现ROC曲线绘制(二分类和多分类)
  7. Leetcode——300. 最长上升子序列
  8. php mysql合同跟踪,使用TCP协议进行路由跟踪
  9. Python中隐藏了你不知道的10个彩蛋
  10. 求旋转数组的最小元素
  11. 设计模式14——行为型模式之职责链模式
  12. “经历”重于“技术”
  13. 利用随机数种子来使pytorch中的结果可以复现
  14. mysql的语句大全_mysql语句大全
  15. 毫秒级超低延时直播产品实测(PRTC直播/webRTC直播)
  16. flash 图片有描边 html,Flash遮罩制作线条逐渐显示的汽车轮廓动画效果
  17. 基于WinPcap的网络流量在线分析系统的设计与实现
  18. Python开发基础----数据类型----[列表]
  19. CF1463-C. Busy Robot
  20. Win10如何禁止自动更新?Win10禁止更新又恢复怎么办?

热门文章

  1. 更改ORACLE归档路径及归档模式
  2. hdu 1723 DP/递推
  3. Linq之Expression高级篇(常用表达式类型)
  4. SSAS系列——【03】多维数据(多维数据集对象)
  5. 邓文迪撑杆跳,甩开老公要独立?_富杂志_新浪博客
  6. HTTP 500 服务器内部错误的解决方法
  7. python函数文档说明调用方式_Python 跨.py文件调用自定义函数说明
  8. oracle分区属于什么知识,详细讲解Oracle表分区的相关概念及其优点
  9. Xilinx 在文档中所用的 LC(logic cells) 与 LUT之间的换算关系
  10. Verilog中状态机编码方式的选择:二进制编码(Binary)、格雷码(Gray-code)编码、独热码(One-hot)编码