传送门


可以发现它的式子是一个分数规划的式子,所以可以二分答案,将所有边权减掉当前二分值之后跑一边$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. 纯小白入手 vue3.0 CLI - 3.1 - 路由 ( router )

    vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 尽量把纷繁的知识,肢解重组成为可以堆砌的知识. ...

  2. 洗礼灵魂,修炼python(39)--面向对象编程(9)—魔法方法表

    好的,不多说,大招来了,几乎完整的魔法方法: 基本的魔法方法 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Defi ...

  3. jquery判断checkBox的checked

    jquery判断checked的三种方法:.attr('checked):   //看版本1.6+返回:”checked”或”undefined” ;1.5-返回:true或false.prop('c ...

  4. webApi core2 DI通过代码来获取容器里面已注入的对象

    请求服务 来自 HttpContext 的一次 ASP.NET 请求中可用的服务通过 RequestServices 集合公开的. 请求服务将你配置的服务和请求描述为应用程序的一部分.当你的对象指定依 ...

  5. sql server 如何查询出数据库作业所有者的信息并完成批量替换

    今天数据库对入职一年的我建立了独立的数据库账号,之前我是和其他同事共享的,之前的所有者账号被废弃了,这时导致很多数据库作业执行失败. 下面是说明如何把之前所有的作业的所有者替换成正在使用的账号: 下面 ...

  6. Business talking in English

    Talking one: A: Microsoft, this is Steve. B: Hi Steve, this is Richard from Third Hand Testing. I am ...

  7. 【PAT】B1043 输出PATest(20 分)

    /* */ #include<stdio.h> #include<algorithm> #include<string.h> #include<ctype.h ...

  8. 第 16 章 C 预处理器和 C 库(条件编译)

    /*-------------------------------------- names_st.h -- names_st 结构的头文件 ----------------------------- ...

  9. 解决win10系统dpi放大后,部分网页文字颜色很浅的问题

    前段时间,换了个27寸的4k显示器.原始分辨率下文字太小,眼睛估计得看瞎 放大dpi后,这问题,那问题,好多 百度知道,淘宝,这网页文字颜色也非常的浅,看着眼睛很累人 看了半天是字体若的祸 暂时发现A ...

  10. 2018. first week now at home

    外面雪刚停. 现在是2018.1.5 2018 needs to consider next steps了.未雨绸缪啊     下面是2017年last working day   外面黑了,水面上黑 ...