[HNOI2009]最小圈 分数规划 spfa判负环

题面

思路难,代码简单。

题目求圈上最小平均值,问题可看为一个0/1规划问题,每个边有\(a[i],b[i]\)两个属性,\(a[i]=w(u,v),b[i]=1\),问题转化为\(min(\frac{\sum^{k}_{i=1}a[i]}{\sum^{k}_{j=1}b[j]})\)

分数规划考虑二分答案,当前\(mid\)可能为答案当且仅当:

\[\frac{\sum^{k}_{i=1}a[i]}{\sum^{k}_{j=1}b[j]} < mid
\]

化简即为判定:

\[\sum{}^{k}_{i=1} (a[i]-mid)<0
\]

每次二分答案时,将图中所有边权\(a[i]​\)视为\(a[i]-mid​\),此时问题转换为一个\(spfa​\)判负环问题,考虑使用\(dfs​\)优化的\(spfa​\)

AC Code:

#include <cstdio>
#include <cstring>
#define MAXN 3003
#define MAXM 10010
using namespace std;
int head[MAXN],nxt[MAXM],vv[MAXM],tot;
double ww[MAXM];
inline void add_edge(int u, int v, double w){
vv[++tot]=v;
ww[tot]=w;
nxt[tot]=head[u];
head[u]=tot;
}
double dis[MAXN];
bool vis[MAXN];
bool spfa(int u, double mid){
vis[u]=1;
for(register int i=head[u];i;i=nxt[i]){
int v=vv[i];double w=ww[i]-mid;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
if(vis[v]) return 1;
if(spfa(v,mid)) return 1;
}
}
vis[u]=0;
return 0;
}
inline int read()
{
int s=0,f=1;
char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-')f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+ch-'0';ch=getchar();}
return s*f;
}
int n,m;
int main()
{
n=read(),m=read();
while(m--){
int a,b;double w;a=read(),b=read();scanf("%lf", &w);
add_edge(a,b,w);
}
double l=-1e7,r=1e7,mid;
while(r-l>1e-10){
mid=(l+r)/2;
memset(dis, 0, sizeof(dis));
memset(vis, 0, sizeof(vis));
bool isOK=0;
for(register int i=1;i<=n;++i)
if(spfa(i,mid)){
isOK=1;break;
}
if(isOK) r=mid;
else l=mid;
}
printf("%.8lf", mid);
return 0;
}

[HNOI2009]最小圈 分数规划 spfa判负环的更多相关文章

  1. 【BZOJ1486】【HNOI2009】最小圈 分数规划 dfs判负环。

    链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...

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

  3. 2018.09.24 bzoj1486: [HNOI2009]最小圈(01分数规划+spfa判负环)

    传送门 答案只保留了6位小数WA了两次233. 这就是一个简单的01分数规划. 直接二分答案,根据图中有没有负环存在进行调整. 注意二分边界. 另外dfs版spfa判负环真心快很多. 代码: #inc ...

  4. [P1768]天路(分数规划+SPFA判负环)

    题目描述 “那是一条神奇的天路诶~,把第一个神犇送上天堂~”,XDM先生唱着这首“亲切”的歌曲,一道猥琐题目的灵感在脑中出现了. 和C_SUNSHINE大神商量后,这道猥琐的题目终于出现在本次试题上了 ...

  5. [bzoj1486][HNOI2009]最小圈——分数规划+spfa+负环

    题目 传送门 题解 这个题是一个经典的分数规划问题. 把题目形式化地表示,就是 \[Minimize\ \lambda = \frac{\sum W_{i, i+1}}{k}\] 整理一下,就是 \[ ...

  6. bzoj1690:[Usaco2007 Dec]奶牛的旅行(分数规划+spfa判负环)

    PS:此题数组名皆引用:戳我 题目大意:有n个点m条有向边的图,边上有花费,点上有收益,点可以多次经过,但是收益不叠加,边也可以多次经过,但是费用叠加.求一个环使得收益和/花费和最大,输出这个比值. ...

  7. [HNOI2009]最小圈(分数规划+SPFA判负环)

    题解:求环长比环边个数的最小值,即求min{Σw[i]/|S|},其中i∈S.这题一眼二分,然后可以把边的个数进行转化,假设存在Σw[i]/|S|<=k,则Σw[i]-k|S|<=0,即Σ ...

  8. 【HNOI2009】最小圈 题解(SPFA判负环+二分答案)

    前言:模拟赛考试题,不会做,写了个爆搜滚蛋仍然保龄. --------------------- 题目链接 题目大意:给定一张有向图,求一个环,使得这个环的长度与这个环的大小(所含结点个数)的比值最小 ...

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

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

随机推荐

  1. 纯css实现移动端横向滑动列表&&overflow:atuo;隐藏滚动条

    <!DOCTYPE html> <html> <head> <title>横向滑动</title> <style type=" ...

  2. QT聊天室--重大bug

    发送qqqqqqqqqqqqqqqqqqqqqqq: 发送test

  3. Spring (1)框架

    Spring第一天笔记   1. 说在前面 怎样的架构的程序,我们认为是一个优秀的架构? 我们考虑的标准:可维护性好,可扩展性好,性能. 什么叫可扩展性好? 答:就是可以做到,不断的增加代码,但是可以 ...

  4. CentOS7.x使用overlay2文件系统

    当我查看docker详细信息时会看到如下警告: WARNING: devicemapper: usage of loopback devices is strongly discouraged for ...

  5. BZOJ4199 NOI2015品酒大会(后缀树)

    利用SAM建出后缀树,树上每个节点计算一下|right|.right集合中ai的最大.次大.最小.次小值即可. #include<iostream> #include<cstdio& ...

  6. 配置闪回恢复区开启归档,未配置清理归档脚本,数据库hang住

    问题现象,测试环境执行SQL hang住 enmo:/home/oracle/worksh dg.sh SQL*Plus: Release Production on Mon May :: Copyr ...

  7. (一)JNDI基础

    一.简介 在Tomcat 4.1.27之后,在服务器上就直接增加了数据源的配置选项,直接在服务器上配置好数据源连接池即可.在J2EE服务器上保存着一个数据库的多个连接.每一个连接通过DataSourc ...

  8. JDBC 学习复习6 学习与编写数据库连接池

    之前的工具类DBUtil暴露的问题 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的 ...

  9. kong命令(四)upstream

    介绍 upstream 就是一个虚拟的服务.可用于配置多个target目标服务时实现负载均衡的效果. 注意:service的host指的就是upstream的name. 同时upstream提供了一个 ...

  10. JavaScript指定日期格式化

    formatDataToString:function (dates, formats) { var o = { "M+": dates.getMonth() + 1, //月份 ...