传送门


可以发现它的式子是一个分数规划的式子,所以可以二分答案,将所有边权减掉当前二分值之后跑一边$SPFA$判断负环即可。

然而这道题把$BFS-SPFA$卡掉了却没卡$DFS-SPFA$

出题人:想不到吧

然而这道题目其实是有结论的,具体可以去看rqy聚聚的blog,反正我是看不懂

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define ld long double
#define eps 1e-10
//This code is written by Itst
using namespace std;

inline int read(){
    ;
    ;
    char c = getchar();
    while(c != EOF && !isdigit(c)){
        if(c == '-')
            f = ;
        c = getchar();
    }
    while(c != EOF && isdigit(c)){
        a = (a << ) + (a << ) + (c ^ ');
        c = getchar();
    }
    return f ? -a : a;
}

 , MAXM = ;
struct Edge{
    int end , upEd;
    ld w;
}Ed[MAXM];
ld minDis[MAXN];
int head[MAXN] , flo[MAXN] , N , M , cntEd;
queue < int > q;
bool inq[MAXN] , vis[MAXN];

inline void addEd(int a , int b , ld c){
    Ed[++cntEd].end = b;
    Ed[cntEd].upEd = head[a];
    head[a] = cntEd;
    Ed[cntEd].w = c;
}

/*bool SPFA(){
    memset(minDis , 0 , sizeof(minDis));
    for(int i = 1 ; i <= N ; ++i){
        if(!inq[i]){
            inq[i] = 1;
            q.push(i);
        }
        flo[i] = 1;
    }
    while(!q.empty()){
        int t = q.front();
        q.pop();
        inq[t] = 0;
        for(int i = head[t] ; i ; i = Ed[i].upEd)
            if(minDis[Ed[i].end] > minDis[t] + Ed[i].w + eps){
                minDis[Ed[i].end] = minDis[t] + Ed[i].w;
                flo[Ed[i].end] = flo[t] + 1;
                if(flo[Ed[i].end] > N)
                    return 1;
                if(!inq[Ed[i].end]){
                    inq[Ed[i].end] = 1;
                    q.push(Ed[i].end);
                }
            }
    }
    return 0;
    }*/
bool SPFA(int now){
    vis[now] = ;
    for(int i = head[now] ; i ; i = Ed[i].upEd)
        if(minDis[Ed[i].end] > minDis[now] + Ed[i].w)
            if(vis[Ed[i].end])
                ;
            else{
                minDis[Ed[i].end] = minDis[now] + Ed[i].w;
                if(SPFA(Ed[i].end))
                    ;
            }
    vis[now] = ;
    ;
}

inline void add(ld num){
     ; i <= cntEd ; ++i)
        Ed[i].w += num;
}

bool check(ld mid){
    ;
    add(-mid);
    memset(minDis ,  , sizeof(minDis));
    memset(vis ,  , sizeof(vis));
     ; !f && i <= N ; ++i)
         && minDis[i] < 1e-)
            f = SPFA(i);
    add(mid);
    return f;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("3199.in" , "r" , stdin);
    //freopen("3199.out" , "w" , stdout);
#endif
    N = read();
    M = read();
     ; i <= M ; ++i){
        int a = read() , b = read();
        ld c;
        scanf("%Lf" , &c);
        addEd(a , b , c);
    }
    ld L = -1e7 , R = 1e7;
    while(R - L > eps){
        ld mid = (L + R) / ;
        check(mid) ? R = mid : L = mid;
    }
    printf("%.8Lf" , L);
    ;
}

Luogu3199 HNOI2009 最小圈 分数规划、SPFA的更多相关文章

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

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

  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. [bzoj1486][HNOI2009]最小圈——分数规划+spfa+负环

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

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

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

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

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

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

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

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

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

  9. Bzoj1486/洛谷P3199 最小圈(0/1分数规划+spfa)/(动态规划+结论)

    题面 Bzoj 洛谷 题解(0/1分数规划+spfa) 考虑\(0/1\)分数规划,设当前枚举到的答案为\(ans\) 则我们要使(其中\(\forall b_i=1\)) \[ \frac{\sum ...

随机推荐

  1. 使用jquery获取iframe内的元素属性

    当需要获取iframe里的内容时需要有几个前提,否则你是获取不到的: 1:当前页面与iframe的src的页面需要在同一个域名下: 2:必须要等iframe里边的页面加载完成才能获取,否则你要获取的标 ...

  2. html中用href 实现点击链接弹出文件下载对话框

    浏览器支持能够打开的格式,他都会默认直接在线打开(比如word或图片),不支持的格式,他就会弹出下载提示.最好是做成.rar格式.xlsx的文件.浏览器自带下载功能. <body> < ...

  3. css制作表格

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. VUE组件 之 倒计时(防刷新)

    思路: 一.效果图: 二.CSS代码 .box{ width: 300px; height: 100px; line-height: 100px; margin: 100px auto; backgr ...

  5. ArcGIS JavaScript API动态图层

      矢量动态图层     <!DOCTYPE HTML> <html>   <head> <meta http-equiv="Content-Typ ...

  6. Sql 查询结果 根据某个字段值 变更另外一个字段值 case when

    SELECT CASE THEN '*******' ELSE Plate END AS Plate, CarType FROM Cars;

  7. 实时监听input输入的变化(兼容主流浏览器)【转】

    遇到如此需求,首先想到的是change事件,但用过change的都知道只有在input失去焦点时才会触发,并不能满足实时监测的需求,比如监测用户输入字符数. 在经过查阅一番资料后,欣慰的发现firef ...

  8. Vue框架的两种使用方式

    1.单页面应用:使用Vue CLI工具生成脚手架,这是最常见的使用方式,简单用模板生成一个HelloWorld Demo,可以学习Vue的SPA项目结构 2.传统多页面应用:通过script引入Vue ...

  9. MySQL备份及数据恢复

    昨天MySQL意外挂了,重启不成功.然后悲剧的发现,之前做的磁盘快照规则也不知怎么没有生效,数据无备份. 后来咨询.搜索,结果: 1.可以配置两个参数,忽略检查,启动,可以读数据.然后导出,删除文件库 ...

  10. Spring Boot属性配置文件详解

    相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷.我们在Spring Boot使用过程中,最直观的感受就是没有了原来自己整合Spring应用时繁 ...