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. Linux中使用export命令设置环境变量

    Linux export 命令 2011-08-31 22:36:39|  分类: 命令总结|举报|字号 订阅     功能说明:设置或显示环境变量. ######################## ...

  2. 并发编程(四):atomic

    本篇博客我们主要讲述J.U.C包下的atomic包,在上篇博客"并发模拟"的最后,我们模拟高并发的情形时出现了线程安全问题,怎么解决呢?其实解决的办法有很多中,如直接在add()方 ...

  3. MDCC2013会议笔记

    技术性的Topic听的不多,也没记多少东西. 下面这些是产品设计论坛的笔记: 互联网为实体行业带来:数据驱动,用户参与,快速验证想法 体验整合:线上与线下,产品与服务,运营与营销,用户和利益相关方体验 ...

  4. Android 众多的布局属性详解

    http://www.open-open.com/lib/view/open1328686184311.html Android功能强大,界面华丽,但是众多的布局属性就害苦了开发者,下面这篇文章结合了 ...

  5. KNN算法思想与实现

    第二章 k近邻 2.1 算法描述 (1)采用测量不同特征值之间的距离进行分类 优点:对异常点不敏感,精度高,无数据输入设定 缺点:空间,计算复杂度高 适合数据:标称与数值 (2)算法的工作原理: 基于 ...

  6. 纯CSS炫酷的3D旋转

    <html><head><meta charset="utf-8"><title>纯CSS炫酷的3D旋转</title> ...

  7. 搭建第一个spring boot项目

    一.开发工具建议使用Spring Tool Suite 下载地址:http://spring.io/tools/sts/all/ 点击versions选择相应的版本下载,解压后直接运行即可. 二.创建 ...

  8. Python 基础【二】 上

    一.python语言分类 1. C python   c语言的python版本 官方推荐 使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行 ...

  9. webpack4 splitChunksPlugin && runtimeChunkPlugin 配置杂记

    webpack2 还没研究好,就发现升级到4了,你咋这么快~ 最近要做项目脚手架,项目构建准备重新做,因为之前写的太烂了...然后发现webpack大版本已经升到4了(又去看了一眼,4.5了),这么快 ...

  10. 【淘宝客】根据淘客联盟精选清单(淘宝天猫内部优惠券)随机显示淘宝天猫优惠券dome

    也许大家在生活中经常淘宝看到[淘宝天猫内部优惠券]的网站,或者在微博中经常有博主发券,让大家生活中购物便宜许多,作为一个站长,我们也希望自己的网站也能有这样的一个功能,现在就分享给大家,还是免后台哦. ...