传送门


可以发现它的式子是一个分数规划的式子,所以可以二分答案,将所有边权减掉当前二分值之后跑一边$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. JavaScript原型与原型链,原型的实际应用

    原型链是js面向对象的基础,非常重要. 一,创建对象的几种方法: 1,字面量 var o1 = { name:'o1' }; 2,构造函数 var M = function(name){ this.n ...

  2. Android 系统工具类

    系统工具类 public class systemUtil { //隐藏ipad底部虚拟按键栏 @RequiresApi(api = Build.VERSION_CODES.KITKAT) publi ...

  3. getWidth()和getMeasuredWidth()的区别

    结论:getMeasuredWidth()获取的是view原始的大小,也就是这个view在XML文件中配置或者是代码中设置的大小.getWidth()获取的是这个view最终显示的大小,这个大小有可能 ...

  4. mac上Android环境变量配置

    1.AndroidSDK路径查看 (1)AndroidStudio: 菜单栏AndroidStudio > Preferences > Appearences&Behavior & ...

  5. XP环境下C# 调用Pocess.start()时提示文件找不到的错误解决办法

    错误提示如下: System.ComponentModel.Win32Exception (0x80004005): 系统找不到指定的文件. 在 System.Diagnostics.Process. ...

  6. Python3.5中安装Scrapy包时出现问题

    在Python3.5中安装Scrapy第三方库 pip install Scrapy 安装到后面出现的这类错误: error: Microsoft Visual C++ 14.0 is require ...

  7. .NET 序列化成XML, 并且格式化

    现有Person类: [Serializable] public class Person { public string Name; public string Info; public Perso ...

  8. iOS-省市区选择的实现

    一.简介 该文主要实现的是省市区的选择,可在个人修改地址的地方使用. 二.需要的东西 制作这个首先需要一个area.plist文件,该文件中保存这所有的关于省市区的信息,下载地址:http://pan ...

  9. scanf函数(初学者)

    scanf函数称为格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中. 1.scanf函数的一般形式:scanf函数是一个标准的库函数,它的函数原型在头文件“stdio.h”中,与pr ...

  10. 17秋 软件工程 团队第五次作业 Alpha Scrum11

    17秋 软件工程 团队第五次作业 Alpha Scrum11 今日完成的任务 世强:管理员头像图片上传和显示逻辑处理,活动添加及上传图片: 港晨:完成Web界面前后端对接: 树民:标准化后端接口格式: ...