题目大意

给你一个有向图,求出图中环的平均值的最小值

环的平均值定义:环中所有的边权和/环中点数量

思路

看到使平均值最大或最小,可以考虑分数规划

分数规划用于解决一些要让平均值最大或最小的问题

具体就是二分答案\(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]最小圈 题解的更多相关文章

  1. BZOJ1486:[HNOI2009]最小圈——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=1486 https://www.luogu.org/problemnew/show/P3199 题面 ...

  2. 【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 ...

  3. bzoj 1486: [HNOI2009]最小圈 dfs求负环

    1486: [HNOI2009]最小圈 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1022  Solved: 487[Submit][Status] ...

  4. BZOJ 1486: [HNOI2009]最小圈( 二分答案 + dfs判负圈 )

    二分答案m, 然后全部边权减掉m, 假如存在负圈, 那么说明有平均值更小的圈存在. 负圈用dfs判断. ------------------------------------------------ ...

  5. 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 ...

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

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

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

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

  8. BZOJ1486 HNOI2009 最小圈 【01分数规划】

    BZOJ1486 HNOI2009 最小圈 Description 应该算是01分数规划的裸板题了吧..但是第一次写还是遇到了一些困难,vis数组不清零之类的 假设一个答案成立,那么一定可以找到一个环 ...

  9. 【算法】01分数规划 --- HNOI2009最小圈 & APIO2017商旅 & SDOI2017新生舞会

    01分数规划:通常的问法是:在一张有 \(n\) 个点,\(m\) 条边的有向图中,每一条边均有其价值 \(v\) 与其代价 \(w\):求在图中的一个环使得这个环上所有的路径的权值和与代价和的比率最 ...

随机推荐

  1. 《利用Python进行数据分析》自学知识图谱-导航

    项目简介 Project Brief <利用Python进行数据分析-第二版>自学过程中整理的知识图谱. Python for Data Analysis: Data Wrangling ...

  2. DQL:查询表中的记录

    DQL:查询表中的记录 * select * from 表名; 1. 语法: select 字段列表 from 表名列表 where 条件列表 group by 分组字段 having 分组之后的条件 ...

  3. OSCP Learning Notes - Enumeration(4)

    DNS Enumeration 1. Host Tool host is a simple utility for performing DNS lookups. It is normally use ...

  4. 团队转型,Scrum与DevOps要如何取舍?

    团队在践行敏捷的过程中,会有多种选择:Scrum.XP.Kanban.Crystal.精益生产.规模化敏捷等,其中最流行的敏捷开发方法当属Scrum.正因如此,大部分人对其产生了刻板印象:认为敏捷就是 ...

  5. ThreadLocal 原理

    ThreadLocal是什么 ThreadLocal是一个本地线程副本变量工具类.主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用, ...

  6. LQB2013A02排它平方数

    这个题方向其实还算好找,就是枚举嘛 (这是一个填空题,所以六个for嵌套也无所谓,因为毕竟emmmm,不看时间) 这里是判断的代码: 需要把数字转化成字符串 void i2s(int x,string ...

  7. 移动端宽高适配JS

    //定义全局变量 var winWidth = 0; /*窗口宽度*/ var winHeight = 0; /*窗口高度*/ //函数区 //实时获取浏览器窗口大小,当窗口大小变化开始相应操作 fu ...

  8. 两数相加(B站看视频总结)

    ''' 两数相加: 给出两个 非空 的链表用来表示两个非负的整数 各自的位数是按照逆序的方式存储的 每一个节点只能保存 一位数 示例: 输入:(2->4->3) + (5->6-&g ...

  9. PHP curl_share_init函数

    (PHP 5 >= 5.5.0) curl_share_init — 初始化一个 cURL 共享句柄 说明 resource curl_share_init ( void ) 允许两个 cURL ...

  10. PHP date_format() 函数

    ------------恢复内容开始------------ 实例 返回一个新的 DateTime 对象,然后格式化日期: <?php$date=date_create("2013-0 ...