题面:[HNOI2009]最小圈

题目描述:

考虑带权的有向图\(G=(V,E)\)以及\(w:E\rightarrow R\),每条边\(e=(i,j)(i\neq j,i\in V,j\in V)\)的权值定义为\(w_{i,j}\),令\(n=|V|\)。\(c=(c_1,c_2,\cdots,c_k)(c_i\in V)\)是\(G\)中的一个圈当且仅当\((c_i,c_{i+1})(1\le i\lt k)\)和\((c_k,c_1)\)都在\(E\)中,这时称\(k\)为圈\(c\)的长度同时令\(c_{k+1}=c_1\),并定义圈\(c=(c_1,c_2,\cdots,c_k)\)的平均值为\(\mu(c)=\sum\limits_{i=1}^{k} w_{c_i,c_{i+1}}/k\),即\(c\)上所有边的权值的平均值。令\(\mu'(c)=Min(\mu(c))\)为\(G\)中所有圈\(c\)的平均值的最小值。现在的目标是:在给定了一个图\(G=(V,E)\)以及\(w:E\rightarrow R\)之后,请求出\(G\)中所有圈\(c\)的平均值的最小值\(\mu'(c)=Min(\mu(c))\)

输入格式:

第一行2个正整数,分别为\(n\)和\(m\),并用一个空格隔开,只用\(n=|V|,m=|E|\)分别表示图中有\(n\)个点\(m\)条边。
接下来m行,每行3个数\(i,j,w_{i,j}\),表示有一条边\((i,j)\)且该边的权值为\(w_{i,j}\)。输入数据保证图\(G=(V,E)\)连通,存在圈且有一个点能到达其他所有点。

输出格式:

请输出一个实数\(\mu'(c)=Min(\mu(c))\),要求输出到小数点后8位。

输入样例#1:

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

输出样例#1:

3.66666667

输入样例#2:

2 2
1 2 -2.9
2 1 -3.1

输出样例#2:

-3.00000000

说明:

对于100%的数据,\(n\le 3000,m\le 10000,|w_{i,j}| \le 10^7\)



\(solution:\)

这道题要我们求平均值的最小值,所以我们考虑二分答案的可能性,先列出答案的意义:

\(ans=\frac{\sum\limits_{i=1}^{k} w_{c_i,c_{i+1}}}{K}\quad _{(c_{k+1}=c_1)}\)

我们将它转换一下:

\(ans*k={\sum\limits_{i=1}^{k} w_{c_i,c_{i+1}}}\quad _{(c_{k+1}=c_1)}\)

\(0=\sum\limits_{i=1}^{k} (w_{c_i,c_{i+1}})-ans*k\quad _{(c_{k+1}=c_1)}\)

\(0=\sum\limits_{i=1}^{k}(w_{c_i,c_{i+1}}-ans)\quad _{(c_{k+1}=c_1)}\)

这样我们发现它已经化成了一个二分答案的常用等式(等式右边可以\(O(n)\)求出来,且具备单调性)而我们注意到等式左边为0,所以我们可以二分ans,并将边权改为\(w_{c_i,c_{i+1}}-mid\) ,然后求负环即可。

为什么可以这样做呢?这个较地震那一题好讲一些,我们当前二分出来的平均值mid,我们将每一条边的边权都减去它,如果存在负环,说明这个环上所有边权实际边权值加起来的平均值一定小于mid!(这里需要仔细想一下)



\(code:\)

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>#define ll long long
#define db double
#define inf 0x7fffffff
#define rg register intusing namespace std;const db cha=1e-9;struct su{db v;int to,next;
}a[10005];bool f;
int n,m,top;
int tou[3005];
bool vis[3005];
db mid,dis[3005];inline int qr(){char ch;while((ch=getchar())<'0'||ch>'9');int res=ch^48;while((ch=getchar())>='0'&&ch<='9')res=res*10+(ch^48);return res;
}inline void add(int x,int y){scanf("%lf",&a[++top].v);a[top].to=y;a[top].next=tou[x];tou[x]=top;
}inline void spfa(int i){vis[i]=1;for(rg j=tou[i];j;j=a[j].next){if(dis[a[j].to]>dis[i]+a[j].v-mid){dis[a[j].to]=dis[i]+a[j].v-mid;if(vis[a[j].to])return void(f=1);else spfa(a[j].to);}}vis[i]=0;
}inline bool check(){for(rg i=1;i<=n;++i)dis[i]=vis[i]=0;;f=0;for(rg i=1;i<=n&&!f;++i)if(!vis[i])spfa(i);return f;
}int main(){freopen("cycle.in","r",stdin);freopen("cycle.out","w",stdout);n=qr(),m=qr();for(rg i=1;i<=m;++i)add(qr(),qr());db l=-1e7,r=1e7;while(l<=r){mid=(l+r)/2;if(check())r=mid-cha;else l=mid+cha;}printf("%.8lf\n",l);return 0;
}

转载于:https://www.cnblogs.com/812-xiao-wen/p/10367943.html

[HNOI2009]最小圈 (二分答案+负环)相关推荐

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

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

  2. BZOJ 1486 最小圈(二分+判负环)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1486 题意:给出一个有向图,边有权值.找到一个环,使得环上边的权值之和除以环上边的个数最 ...

  3. 【BZOJ 1486】 [HNOI2009]最小圈

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 我们可以只想那个均值最小的环. 我们不知道那个环由哪些边构成 但我们可以把每条边都减掉mid 那个环受到的影响是什么呢? 如果这个均 ...

  4. 【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,然后再判 ...

  5. BZOJ3597 [Scoi2014]方伯伯运椰子 【二分 + 判负环】

    题目链接 BZOJ3597 题解 orz一眼过去一点思路都没有 既然是流量网络,就要借鉴网络流的思想了 我们先处理一下那个比值,显然是一个分数规划,我们二分一个\(\lambda = \frac{X ...

  6. [USACO]地震 (二分答案+最优比率生成树详解)

    题面:[USACO 2001 OPEN]地震 题目描述: 一场地震把约翰家的牧场摧毁了, 坚强的约翰决心重建家园. 约翰已经重建了N个牧场,现在他希望能修建一些道路把它们连接起来.研究地形之后,约翰发 ...

  7. [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告

    [NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...

  8. 解题报告:luoguP2868 Sightseeing Cows G(最优比率环,负环判定,二分答案)

    根据题意,我们要环上各点权值之和除以各边权值之和最大. 求最大答案,很明显可以使用二分答案.那么我们假设当前答案为 x,如果有更大的答案,那么方程就可以按下图转换: 也就是说如果有更大的答案,则有一个 ...

  9. [APIO2017]商旅——分数优化+floyd+SPFA判负环+二分答案

    题目链接: [APIO2017]商旅 枚举任意两个点$(s,t)$,求出在$s$买入一个物品并在$t$卖出的最大收益. 新建一条从$s$到$t$的边,边权为最大收益,长度为原图从$s$到$t$的最短路 ...

最新文章

  1. Tomcat源码分析 | 一文带你整体把握架构及组件
  2. 数组的一些常用方法记录
  3. linux iptables 命令简介
  4. python经典100例答案pdf-Python 入门 100 案例,PDF免费下载
  5. JavaWeb(四)——在IDEA中配置Tomcat、pom文件
  6. 玩转oracle 11g(20):ora-00604和ora-00018
  7. win7如何添加终端服务器,Windows7系统超级终端的添加方法 win7如何添加超级终端...
  8. (软件工程复习核心重点)第四章总体设计-第三节:启发规则
  9. 你羡慕了吗?10万个数字人民币红包派发,每个200元
  10. 运行VS2012出现“未找到与约束....”的解决方法
  11. Python(六)基于 TCP/UDP 协议通信的简单套接字编程
  12. 数组(Java基础内容)
  13. ChineseBERT: Chinese Pretraining Enhanced by Glyph and Pinyin Information
  14. 自然数e的故事(转)
  15. 戴尔d系列服务器,戴尔科技集团推出两款全新VxRail产品
  16. 5G/NR 下行物理信道之PDCCH概要
  17. rt linux 测试,Ubuntu下测试RT-Linux的性能
  18. 科学计算机读书报告单,科学网—读书报告-20171016 - 梁斌的博文
  19. 陈景润4篇代表性数学论文
  20. 删除 mysql ibd文件_误删除MySQL数据库表的ibd文件怎么办

热门文章

  1. office在线编辑器
  2. ASP.NET2.0 - skmMenu 的使用
  3. 回归!这里才是我们的天堂
  4. 2020全国高中清华北大录取人数榜,各位学生快看!
  5. 计算机视觉库OpenCV中shape和resize函数的区别
  6. mysql设置参数不生效_关于mysql的wait_timeout参数 设置不生效的问题【转】
  7. Oracle 约束 Constraint
  8. python元祖迭代_python *式语法在迭代一个元组序列时的逻辑?
  9. MVC,MVP,MVVM设计模式的比较
  10. 巧妙的 排序+去重——C语言