bzoj千题计划227:bzo1486: [HNOI2009]最小圈j

Posted 日拱一卒 功不唐捐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj千题计划227:bzo1486: [HNOI2009]最小圈j相关的知识,希望对你有一定的参考价值。

http://www.lydsy.com/JudgeOnline/problem.php?id=1486

 

二分答案

dfs版spfa判负环

 

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>

#define N 3001
#define M 10001

using namespace std;

int n;

int tot,front[N],nxt[M],to[M];
double val[M];

double Val[M];

double dis[N];
bool vis[N];

bool tag;

queue<int>q;

int s;

void read(int &x)
{
    x=0; char c=getchar();
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) { x=x*10+c-0; c=getchar(); }
}

void add(int u,int v,double w)
{
    to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; val[tot]=w;
}    

void spfa(int u)
{
    //if(tag) return;
    int t;
    for(int i=front[u];i;i=nxt[i])
    {
        t=to[i];
        if(dis[u]+Val[i]<dis[t])
        {
            dis[t]=dis[u]+Val[i];
            if(!vis[t])
            {
                vis[t]=true;
                spfa(t);
                vis[t]=false;
                if(tag) return;
            }
            else 
            {
                tag=true;
                return;
            }
        }
    }
}

bool check(double mid)
{
    for(int i=1;i<=tot;++i) Val[i]=val[i]-mid;
    tag=false;
    for(int i=1;i<=n;++i)
    {    
        for(int j=1;j<=n;++j) dis[j]=0;
        vis[i]=true;
        spfa(i);
        vis[i]=false;
        if(tag) return true;
    }
    return false;
}

int main()
{
    int m;
    read(n); read(m);
    int u,v; double w;
    while(m--)
    {
        read(u); read(v); scanf("%lf",&w);
        add(u,v,w);
    }
    double l=-1e6,r=1e6,mid,ans;
    int T=55;
    while(T--)
    {
        mid=(l+r)/2;
        if(!check(mid)) ans=l,l=mid;
        else r=mid;
    }
    printf("%.8lf",ans);
}

 

1486: [HNOI2009]最小圈

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 2715  Solved: 1304
[Submit][Status][Discuss]

Description

技术分享图片技术分享图片

Input

 

Output

 

Sample Input

4 5
1 2 5
2 3 5
3 1 5
2 4 3
4 1 3

Sample Output

3.66666667

以上是关于bzoj千题计划227:bzo1486: [HNOI2009]最小圈j的主要内容,如果未能解决你的问题,请参考以下文章

bzoj千题计划197:bzoj4247: 挂饰

bzoj千题计划118:bzoj1028: [JSOI2007]麻将

bzoj千题计划165:bzoj5127: 数据校验

bzoj千题计划144:bzoj1176: [Balkan2007]Mokia

bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

bzoj千题计划142:bzoj3144: [Hnoi2013]切糕