BZOJ1486: [HNOI2009]最小圈
1486: [HNOI2009]最小圈
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 2728 Solved: 1315
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
4 5
1 2 5
2 3 5
3 1 5
2 4 3
4 1 3
Sample Output
3.66666667
HINT
Source
题解
\(0/1\)分数规划裸题
学了一发\(dfsspfa\)判负环
依据是任何一个负环都可以从一个点开始走,总是走最短路减小且最短路为负的点到终点
把\(d\)全部负为\(0\),就可以保证走的每一步都是负的。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <map>
#include <cmath>
inline int max(int a, int b){return a > b ? a : b;}
inline int min(int a, int b){return a < b ? a : b;}
inline int abs(int x){return x < 0 ? -x : x;}
inline void swap(int &x, int &y){int tmp = x;x = y;y = tmp;}inline void read(int &x)
{x = 0;char ch = getchar(), c = ch;while(ch < '0' || ch > '9') c = ch, ch = getchar();while(ch <= '9' && ch >= '0') x = x * 10 + ch - '0', ch = getchar();if(c == '-') x = -x;
}
const int INF = 0x3f3f3f3f;
const int MAXN = 3000 + 10;
const int MAXM = 10000 + 10;
const double eps = 0.000000001;
struct Edge
{int u,v,nxt;double w;Edge(int _u, int _v, double _w, int _nxt){u = _u, v = _v, w = _w, nxt = _nxt;}Edge(){}
}edge[MAXM << 1];
int head[MAXN], cnt, vis[MAXN], n, m, sum, flag;
double d[MAXN];
inline void insert(int a, int b, double c)
{edge[++ cnt] = Edge(a, b, c, head[a]), head[a] = cnt;
}
void dfs(int x)
{if(flag) return;vis[x] = 1;for(int pos = head[x];pos;pos = edge[pos].nxt){int v = edge[pos].v;if(d[v] > d[x] + edge[pos].w){if(vis[v]){flag = 1;break;}d[v] = d[x] + edge[pos].w;dfs(v);}}vis[x] = 0;
}
int main()
{read(n), read(m);for(int i = 1;i <= m;++ i){int tmp1, tmp2;double tmp3;read(tmp1), read(tmp2), scanf("%lf", &tmp3);insert(tmp1, tmp2, tmp3);sum += abs(tmp3);}double l = -sum, r = sum, mid, ans;while(r - l >= eps){mid = (l + r) / 2;flag = 0;for(int i = 1;i <= cnt;++ i) edge[i].w -= mid;for(int i = 1;i <= n;++ i){memset(d, 0, sizeof(d));dfs(i);if(flag) break;}if(flag) r = mid;else l = mid, ans = mid;for(int i = 1;i <= cnt;++ i) edge[i].w += mid;}printf("%.8lf", ans);return 0;
}
转载于:https://www.cnblogs.com/huibixiaoxing/p/8544858.html
BZOJ1486: [HNOI2009]最小圈相关推荐
- bzoj千题计划227:bzoj1486: [HNOI2009]最小圈
http://www.lydsy.com/JudgeOnline/problem.php?id=1486 二分答案 dfs版spfa判负环 #include<queue> #include ...
- [HNOI2009]最小圈 (二分答案+负环)
题面:[HNOI2009]最小圈 题目描述: 考虑带权的有向图\(G=(V,E)\)以及\(w:E\rightarrow R\),每条边\(e=(i,j)(i\neq j,i\in V,j\in V) ...
- 【bzoj1486】[HNOI2009]最小圈 分数规划+Spfa
题目描述 样例输入 4 5 1 2 5 2 3 5 3 1 5 2 4 3 4 1 3 样例输出 3.66666667 题解 分数规划+Spfa判负环 二分答案mid,并将所有边权减去mid,然后再判 ...
- 【BZOJ 1486】 [HNOI2009]最小圈
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 我们可以只想那个均值最小的环. 我们不知道那个环由哪些边构成 但我们可以把每条边都减掉mid 那个环受到的影响是什么呢? 如果这个均 ...
- 洛谷4951 地震 bzoj1816扑克牌 洛谷3199最小圈 / 01分数规划
洛谷4951 地震 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #define ...
- BZOJ 1486 最小圈(二分+判负环)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1486 题意:给出一个有向图,边有权值.找到一个环,使得环上边的权值之和除以环上边的个数最 ...
- [USACO]地震 (二分答案+最优比率生成树详解)
题面:[USACO 2001 OPEN]地震 题目描述: 一场地震把约翰家的牧场摧毁了, 坚强的约翰决心重建家园. 约翰已经重建了N个牧场,现在他希望能修建一些道路把它们连接起来.研究地形之后,约翰发 ...
- 清北学堂学习笔记 第一期
Day 1 1.贪心的奇怪方法:调整法 调整法,顾名思义,就是用别的方式进行题目的分析以及证明,例如说luogu的最大乘积.这种题目的主要分析思路为:先考虑一些简单的情况,通过简单的情况来推出一些有用 ...
- 【QBXT】学习笔记——Day3/4图论+dp
继续上传一波笔记吧. Day3 1.16AM 今天讲图论,以习题为主. 开篇水题: 给一幅图,若删去一个点后变成一棵树,则这个点合法.问哪些点合法. 思路根据树的性质:这个点不是割点,m-这个点的度数 ...
- 浅析代码圈复杂度及认知复杂度
Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...
最新文章
- QQ群功能设计与心理学
- DFTug - Getting Started(下篇)
- div中定义局部变量_说说 Go 中的变量(附粗制滥造面试题)
- Oracel中连接的总结(一)
- Android用GSon处理Json数据
- Apache Doris : 一个开源 MPP 数据库的架构与实践
- 在matlab中输出、读取多个文件
- Chemical table CFR500 div2D(并查集)
- linux自动化作业安排工具cron anacron at batch (2)
- (4)Jquery1.8.3快速入门_基本选择器
- Android 官方独立 adb / fastboot 工具包
- GISer开发者的技能清单
- Meyer Burger获中国客户1800万瑞士法郎光伏设备订单
- 【Pandas学习笔记Task05】:变形
- Enhancement .
- 二分答案——洛谷P2440木材加工
- JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题的解决方法
- 02 固定效应模型与Stata实现
- 台式计算机网卡型号怎么查找,台式机无线网卡如何查看型号
- unity学习途中奇奇怪怪的问题——Unity打不开VS的问题