[HNOI2009]最小圈 题解
题目大意
给你一个有向图,求出图中环的平均值的最小值
环的平均值定义:环中所有的边权和/环中点数量
思路
看到使平均值最大或最小,可以考虑分数规划
分数规划用于解决一些要让平均值最大或最小的问题
具体就是二分答案\(K\)
\(\frac{x_1+x_2+x_3+\dots+x_n}{n}/ge k\Leftrightarrow (x_1-k)+(x_2-k)+(x_3-k)+\dots+(x_n-k)\ge 0\)
很明显,这题完全满足这个分数规划的性质。
故我们枚举一个\(k\),把每条边的边权减去\(k\),再用\(SPFA\)判负环就可以了
具体细节见代码
#include <bits/stdc++.h>
using namespace std ;
const int MAXN = 10000 + 5 ;
struct Node {
int next , to ;
double w ;
} edge[ MAXN ] ;
int head[ MAXN ] , cnt ;
int n , m ;
double d[ MAXN ] ;
bool vis[ MAXN ] ;
inline int read () {
int tot = 0 , f = 1 ; char c = getchar () ;
while ( c < '0' || c > '9' ) { if ( c == '-' ) f = -1 ; c = getchar () ; }
while ( c >= '0' && c <= '9' ) { tot = tot * 10 + c - '0' ; c = getchar () ; }
return tot * f ;
}
inline void add ( int x , int y , double z ) {
edge[ ++ cnt ].next = head[ x ] ;
edge[ cnt ].to = y ;
edge[ cnt ].w = z ;
head[ x ] = cnt ;
}
inline bool spfa ( int u , double t ) {
vis[ u ] = 1 ;
for ( int i = head[ u ] ; i ; i = edge[ i ].next ) {
int v = edge[ i ].to ;
if ( d[ u ] + edge[ i ].w - t < d[ v ] ) {
d[ v ] = d[ u ] + edge[ i ].w - t ;
if ( vis[ v ] || spfa ( v , t ) ) return 1 ; //判负环
}
}
vis[ u ] = 0 ;
return 0 ;
}
inline bool check ( double t ) {
for ( int i = 1 ; i <= n ; i ++ ) d[ i ] = 0 ;
memset ( vis , 0 , sizeof ( vis ) ) ;
for ( int i = 1 ; i <= n ; i ++ ) if ( spfa ( i , t ) ) return 1 ; //每个点都要作为起点来判一遍
return 0 ;
}
signed main () {
n = read () ; m = read () ;
for ( int i = 1 ; i <= m ; i ++ ) {
int x = read () , y = read () ;
double z ; cin >> z ;
add ( x , y , z ) ;
}
double l = -1e7 , r = 1e7 ;
while ( r - l > 1e-12 ) { // 二分答案
double mid = ( l + r ) / 2 ;
if ( check ( mid ) ) r = mid ;
else l = mid ;
}
printf ( "%.8lf\n" , r ) ;
return 0 ;
}
[HNOI2009]最小圈 题解的更多相关文章
- BZOJ1486:[HNOI2009]最小圈——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1486 https://www.luogu.org/problemnew/show/P3199 题面 ...
- 【BZOJ1486】[HNOI2009]最小圈 分数规划
[BZOJ1486][HNOI2009]最小圈 Description Input Output Sample Input 4 5 1 2 5 2 3 5 3 1 5 2 4 3 4 1 3 Samp ...
- bzoj 1486: [HNOI2009]最小圈 dfs求负环
1486: [HNOI2009]最小圈 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1022 Solved: 487[Submit][Status] ...
- BZOJ 1486: [HNOI2009]最小圈( 二分答案 + dfs判负圈 )
二分答案m, 然后全部边权减掉m, 假如存在负圈, 那么说明有平均值更小的圈存在. 负圈用dfs判断. ------------------------------------------------ ...
- BZOJ_1486_[HNOI2009]最小圈_01分数规划
BZOJ_1486_[HNOI2009]最小圈_01分数规划 Description Input Output Sample Input 4 5 1 2 5 2 3 5 3 1 5 2 4 3 4 1 ...
- [HNOI2009]最小圈 (二分答案+负环)
题面:[HNOI2009]最小圈 题目描述: 考虑带权的有向图\(G=(V,E)\)以及\(w:E\rightarrow R\),每条边\(e=(i,j)(i\neq j,i\in V,j\in V) ...
- bzoj千题计划227:bzoj1486: [HNOI2009]最小圈
http://www.lydsy.com/JudgeOnline/problem.php?id=1486 二分答案 dfs版spfa判负环 #include<queue> #include ...
- BZOJ1486 HNOI2009 最小圈 【01分数规划】
BZOJ1486 HNOI2009 最小圈 Description 应该算是01分数规划的裸板题了吧..但是第一次写还是遇到了一些困难,vis数组不清零之类的 假设一个答案成立,那么一定可以找到一个环 ...
- 【算法】01分数规划 --- HNOI2009最小圈 & APIO2017商旅 & SDOI2017新生舞会
01分数规划:通常的问法是:在一张有 \(n\) 个点,\(m\) 条边的有向图中,每一条边均有其价值 \(v\) 与其代价 \(w\):求在图中的一个环使得这个环上所有的路径的权值和与代价和的比率最 ...
随机推荐
- bzoj2648SJY摆棋子&&bzoj2716[Violet 3]天使玩偶*
bzoj2648SJY摆棋子 bzoj2716[Violet 3]天使玩偶 题意: 棋盘上有n个棋子,现在有m个操作,一种是加棋子,一种是查询离某个点最近的棋子.n,m≤500000. 题解: 先将已 ...
- java基础知识--环境变量配置
说到java,大家应该都了解:J2SE基础.J2ME嵌入式.J2EE延伸的内容,而我们平时接触和所谈大部分都是J2EE企业级应用开发. 作为开发者,使用java之前,必须安装java开发环境,配置ja ...
- epic游戏平台如何启用认证器应用程序/二次验证码/谷歌身份验证器?
1.登陆epic游戏平台,找到二次验证绑定界面 登陆https://www.epicgames.com/store/zh-CN/, 点右上角用户头像-[账户]. 之后点-[密码与安全] 在[双重验证] ...
- 7.20试机测 T3 阶乘之和 暴力AC题解
7.20试机测 T3 阶乘之和 暴力AC题解 题外话:此乃本蒟蒻发表的第一篇题解,大家多多关照,支持一下,谢谢 题面 3.阶乘之和(sum.pas/in/out) 问题描述: 给定一个非负整数 n, ...
- 大家是怎么做APP接口的版本控制的?欢迎进来看看我的方案。升级版的Versioning
背景 APP不同于网站,网站程序一发版,所有用户看到的都是最新的页面.调用最新的接口,没有新老版本一说.APP一旦下载到用户手机上,用户不更新你拿他一点办法都没有,但是随着业务的调整,同一个接口的请求 ...
- php iamp 接收邮件,收取邮件,获取邮件列表
每次想写的时候吧,提笔忘字.等到再次使用,又得想半天,,,,,好尴尬. 这次一边做一边写. 心得,程序员从菜鸟往老鸟转变的重要一步,学英语,看文档,在此我万分感谢鸟哥,,,,没他php哪有官方的中文注 ...
- 【工具】 - BeanUtils增强篇
public class BeanPlusUtils extends BeanUtils { public static <S, T> List<T> copyListProp ...
- C++中string类型的find 函数
(去膜拜大佬的博客园,结果被自己菜到自闭) find string中find()返回值是字母在母串中的位置(下标记录),如果没有找到,那么会返回一个特别的标记npos. 对其返回的下标position ...
- 给定两个列表,转换为 DataFrame 类型
import pandas as pd def get_data(): q1 = [] q2 = [] p1 = input("list 1:") p2 = input(" ...
- Python File seek() 方法
概述 seek() 方法用于移动文件读取指针到指定位置.高佣联盟 www.cgewang.com 语法 seek() 方法语法如下: fileObject.seek(offset[, whence]) ...