传送门


可以发现它的式子是一个分数规划的式子,所以可以二分答案,将所有边权减掉当前二分值之后跑一边$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. python之锁, 队列

    进程的其他方法 进程id,进程名字,查看进程是否活着is_alive()  terminate()发送结束进程的信号 import time import os from multiprocessin ...

  2. Salesforce的数据安全防护措施

    通过Salesforce,我们可以配置或开发出功能强大的网络应用.与此同时,无论作为管理员还是开发者,我们都要面对数据安全的问题. 常见的数据安全隐患有: SQL注入 跨站脚本攻击 跨站请求伪造 点击 ...

  3. android系统通过图片绝对路径获取URI的三种方法

    最近做项目要通过图片的绝对路径找到图片的URI,然后删除图片,小小总结一下获取URI的方法,亲自试验在 android 4.1.3的系统上都是可用的. 1.将所有的图片路径取出,遍历比较找到需要的路径 ...

  4. zTree 优秀的jquery树插件

    zTree 优秀的jquery树插件,文档详细,渲染快 使用方法: 1.引用zTree的js和css文件 <link href="~/Content/zTree_v3/css/zTre ...

  5. 深入 kernel panic 流程【转】

    一.前言 我们在项目开发过程中,很多时候会出现由于某种原因经常会导致手机系统死机重启的情况(重启分Android重启跟kernel重启,而我们这里只讨论kernel重启也就是 kernel panic ...

  6. Nginx Linux安装与部署

    Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行. ...

  7. web高并发的解决方案

    我们先了解一下什么是并发和并行 并发:并发是指两个或多个事件在同一时间间隔内发生,就是可以重叠在时间段启动,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机 ...

  8. ABAP 7.50 新特性之另一个CORRESPONDING

    在ABAP中,存在着一条法则:同样的名称代表的不一定是同样的东西(具体可看最近的相关讨论). 但是如你们所知的,存在着一个很好的例外: 所有涉及到使用CORRESPONDING为结构赋值的关键字的语法 ...

  9. codechef Row and Column Operations 题解

    版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/,未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...

  10. 使用KVM虚拟机遇到的问题(持续更新)

    1.qemu-kvm.kvm.qemu 和 qemu-system-x86_64四种命令的差别 qemu 和 qemu-system-x86_64:启动qemu虚拟机的命令,x86_64为64位系统时 ...