Description

找出一个平均边权最小的圈。

Solution

经典问题,二分答案判断有无负环。

但数据范围大,普通spfa会超时,于是用dfs判负环(快多了)。

思路是dis设为0,枚举每个点u,如果d(u)+w<d(v)就搜v,如果搜到的节点曾搜到过说明找到了负环。

为什么是对的呢?对于一个负环,一定可以找到一个节点从这里开始走一直累加权值,权值一直为负。

Code

 #include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=3e5+,M=1e4+; int head[M],e[M],nxt[M],k;
double w[M];
int adde(int u,int v,double g){
e[++k]=v;w[k]=g;nxt[k]=head[u];head[u]=k;
}
int n,m; double d[N];
int vis[N],flag; int spfa(int u){
vis[u]=;
for(int i=head[u];i;i=nxt[i]){
int v=e[i];
if(d[u]+w[i]<d[v]){
if(vis[v]){flag=;break;}
d[v]=d[u]+w[i];
spfa(v);
}
}
vis[u]=;
} int jud(double mid){
for(int i=;i<=k;i++) w[i]-=mid;
memset(d,,sizeof(d));
memset(vis,,sizeof(vis));
flag=;
int ret=;
for(int i=;i<=n;i++){
spfa(i);
if(flag){ret=;break;}
}
for(int i=;i<=k;i++) w[i]+=mid;
return ret;
} int main(){
scanf("%d%d",&n,&m);
int u,v; double g;
for(int i=;i<=m;i++){
scanf("%d%d%lf",&u,&v,&g);
adde(u,v,g);
} double l=-1e7,r=1e7;
while(r-l>1e-){
double mid=(l+r)/;
if(jud(mid)) r=mid;
else l=mid;
}
printf("%.8lf",l);
return ;
}

【dfs判负环】BZOJ1489: [HNOI2009]最小圈的更多相关文章

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

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

  2. SPFA算法的判负环问题(BFS与DFS实现)

    经过笔者的多次实践(失败),在此温馨提示:用SPFA判负环时一定要特别小心! 首先SPFA有BFS和DFS两种实现方式,两者的判负环方式也是不同的.       BFS是用一个num数组,num[x] ...

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

  4. BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)

    BZOJ 差分约束: 我是谁,差分约束是啥,这是哪 太真实了= = 插个广告:这里有差分约束详解. 记\(r_i\)为第\(i\)行整体加了多少的权值,\(c_i\)为第\(i\)列整体加了多少权值, ...

  5. UVA11090 Going in Cycle (二分+判负环)

    二分法+spfa判负环.如果存在一个环sum(wi)<k*x,i=0,1,2...,k,那么每条边减去x以后会形成负环.因此可用spfa来判负环. 一般spfa判负环dfs最快,用stack次之 ...

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

    [HNOI2009]最小圈 分数规划 spfa判负环 题面 思路难,代码简单. 题目求圈上最小平均值,问题可看为一个0/1规划问题,每个边有\(a[i],b[i]\)两个属性,\(a[i]=w(u,v ...

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

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

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

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

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

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

随机推荐

  1. char 与 String 相等比较

    这是一个相当2 相当基础 相当没有意义的帖子:但今天因为这个问题引发了一个bug.小细节也很重要!!!         char a='1'; //      char b='2dsf'; //cha ...

  2. javaScript(3)---语法、关键保留字及变量

    学习要点: 1.语法构成 2.关键字保留字 3.变量 任何语言的核心都必然会描述这门语言最基本的工作原理.而JavaScript的语言核心就是ECMAScript 一.语法构成 区分大小写:ECMAS ...

  3. java多线程的理解

    java多线程的理解   线程的5种状态:新建,就绪,运行,阻塞,死亡. Thread.sleep:线程  运行状态 转为  阻塞状态,(其它线程启动运行) Thread.yield:   线程 运行 ...

  4. 推荐 git community book 中文版

    官方地址:http://Git.seyren.com/index.html 或者 http://gitbook.liuhui998.com/ book@github项目地址: https://gith ...

  5. log4j2.xml全配置文件

    可以参考如下配置 <?xml version="1.0" encoding="UTF-8"?> <!--日志级别以及优先级排序: OFF &g ...

  6. JDBC连接数据库时候出错

    错误提示如下: Fri May 13 09:06:04 CST 2016 WARN: Establishing SSL connection without server's identity ver ...

  7. tomcat 绑定ipv4端口

    在<tomcat>/bin目录打开catalina.sh,然后添加如下内容: JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=t ...

  8. java线程之线程通信

    前面提到多线程操作会有一个资源共享问题. 日常生活中,对于一个超市,有供货商往超市运货,有消费者从超市取货,供货商和消费者都与超市 建立了某种连接,超市就相当于公共资源,而他们的这种行为放到线程上说就 ...

  9. mysql-列属性

    列属性 列属性是真正约束字段的数据类型,但是数据类型的约束很单一,需要有一些额外的约束来确保数据的合法性 NULL/NOT NULL.default.primary key.unique key.au ...

  10. Spring的断言工具类Assert的基本使用

    org.springframework.util.Assert; Assert工具类,通常用于数据合法性检查. 平时做判断通常都是这样写: if(message == null || message. ...