bzoj1486[hnoi2009]最小圈

YuanZiming YuanZiming     2022-08-06     216

关键词:

bzoj1486[HNOI2009]最小圈

题意:

定义图中一个环的平均值为环上边权和除以(浮点除法)边数,求一个图中的最小环平均值,保留8位。n≤3000,m≤10000,有负权边。

题解:

这就是比较明显的01分数规划了,见bzoj1690。同时根据题解二分60次就行了。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define inc(i,j,k) for(int i=j;i<=k;i++)
#define maxn 3010
#define INF 0x3fffffff
using namespace std;

inline int read(){
    char ch=getchar(); int f=1,x=0;
    while(ch<0||ch>9){if(ch==-)f=-1; ch=getchar();}
    while(ch>=0&&ch<=9)x=x*10+ch-0,ch=getchar();
    return f*x;
}
struct e{int t; double w; int n;}es[maxn*4]; int g[maxn],ess;
void pe(int f,int t){es[++ess]=(e){t,0,g[f]}; g[f]=ess;}
double w[maxn*4]; int n,m;
void rebuild(double x){inc(i,1,m)es[i].w=w[i]-x;}
bool ins[maxn],f; double d[maxn];
void dfs(int x){
    ins[x]=1;
    for(int i=g[x];i;i=es[i].n){
        if(f)return;
        if(d[es[i].t]>d[x]+es[i].w){
            if(ins[es[i].t]){f=1; return;} d[es[i].t]=d[x]+es[i].w; dfs(es[i].t);
        }
    }
    ins[x]=0;
}
bool spfa(){
    memset(ins,0,sizeof(ins)); memset(d,0,sizeof(d)); f=0;
    inc(i,1,n){dfs(i); if(f)return 0;} return 1;
}
int main(){
    n=read(); m=read(); inc(i,1,m){int x=read(),y=read(); scanf("%lf",&w[i]); pe(x,y);}
    double l=-10000000,r=10000000; int t=60;
    while(t--){
        double mid=(l+r)/2; rebuild(mid); if(!spfa())r=mid;else l=mid;
    }
    printf("%.8lf",l); return 0;
}

 

20160922

bzoj1486[hnoi2009]最小圈

bzoj1486[HNOI2009]最小圈题意:定义图中一个环的平均值为环上边权和除以(浮点除法)边数,求一个图中的最小环平均值,保留8位。n≤3000,m≤10000,有负权边。题解:这就是比较明显的01分数规划了,见bzoj1690。同时根据题解二... 查看详情

[bzoj1486][hnoi2009]最小圈

[BZOJ1486][HNOI2009]最小圈bzojluogu题意你有一张有向图,保证连通,保证存在至少一个环。你需要找到一个环,最小化环的平均权值。环的平均值定义为环的总权值除以环长。sol分数规划。可以看做每条边的\(b_i=1\)。二分一个\(mid\),... 查看详情

bzoj1486hnoi2009—最小圈

...规定一个数值u表示图中一个环的权值/环中节点个数。求最小的u。Solution   尼玛今天考试题,不知道是考二分的话这真的做不出。。   二分一个答案ans,这个答案可行当且仅当ans>=∑w/cnt,cnt表示环 查看详情

bzoj_1486_[hnoi2009]最小圈_01分数规划

BZOJ_1486_[HNOI2009]最小圈_01分数规划DescriptionInputOutputSampleInput45125235315243413SampleOutput3.66666667 二分答案,边权减去答案,判负环即可。然而spfa判负环会T掉,于是我使用了dfs判负环的方法。dfs判负环代码:voiddfs(intx)vis[x]=1;inti;for(i... 查看详情

bzoj1486:[hnoi2009]最小圈——题解(代码片段)

https://www.lydsy.com/JudgeOnline/problem.php?id=1486https://www.luogu.org/problemnew/show/P3199题面太鬼畜就不粘了。这题唯一正确的解法是https://www.luogu.org/blog/user7868/solution-p3199虽然我看不懂。当然为了AC这道题于是抛弃自己的灵魂写了dfs-spf 查看详情

bzoj1486[hnoi2009]最小圈

【算法】二分+spfa【题解】据说这个叫分数规划?0-1分数规划二分答案a,则对于任意的环有w/k≤a即w-ak≤0,若满足条件则a变小,否则a变大。因为w=w1+w2+...+wk,所以变形为(w1-a)+(w2-a)+...+(wk-a)≤0。于是问题转化为在图中找负环。不... 查看详情

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

http://www.lydsy.com/JudgeOnline/problem.php?id=1486 二分答案dfs版spfa判负环 #include<queue>#include<cstdio>#include<cstring>#include<iostream>#defineN3001#defineM10001usingn 查看详情

bzoj1486[hnoi2009]最小圈分数规划+spfa

题目描述样例输入45125235315243413样例输出3.66666667题解分数规划+Spfa判负环二分答案mid,并将所有边权减去mid,然后再判负环,若有负环则调整下界,否则调整上界,直至上下界基本重合。证明:显然 由于有(c+d)/(a+b+k)>(c+d)/(a+... 查看详情

bzoj1486最小圈[分数规划+负权环]

Description考虑带权的有向图(G=(V,E))以及(w:E ightarrowR),每条边(e=(i,j)(i eqj,iinV,jinV))的权值定义为(w_{i,j}),令(n=|V|)。(c=(c_1,c_2,cdots,c_k)(c_iinV))是(G)中的一个圈当且仅当((ci,ci+1)(1≤i<k))和((ck,c1)) 查看详情

[hnoi2009]最小圈

hnoi2009最小圈Description     #include<iostream>#include<cstdio>#include<cstring>#definemaxn3005#definemaxe10005usingnamespacestd;structEdge{ intv; doublew; int 查看详情

[hnoi2009]最小圈

Description对于一张有向图,要你求图中最小圈的平均值最小是多少,即若一个圈经过k个节点,那么一个圈的平均值为圈上k条边权的和除以k,现要求其中的最小值Input第一行2个正整数,分别为n和m以下m行,每行3个数,表示边连接... 查看详情

[hnoi2009]最小圈(代码片段)

https://zybuluo.com/ysner/note/1144886题面给一有向图,询问圈的最小平均值。解析先二分圈的平均值的最小值,记当前答案为\(mid\)。这时候,把所有的边权都减掉\(mid\)。这样判断原图中是否包含有平均值小于等于\(mid\)的圈,就转化成... 查看详情

洛谷p3199[hnoi2009]最小圈

题目描述对于一张有向图,要你求图中最小圈的平均值最小是多少,即若一个圈经过k个节点,那么一个圈的平均值为圈上k条边权的和除以k,现要求其中的最小值。输入输出格式输入格式:第一行2个正整数,分别为n和m以下m行... 查看详情

bzoj1488[hnoi2009]图的同构

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=14881488:[HNOI2009]图的同构TimeLimit: 10Sec  MemoryLimit: 64MBSubmit: 591  Solved: 388[Submit][Status][Discuss] 查看详情

bzoj1483:[hnoi2009]梦幻布丁

1483:[HNOI2009]梦幻布丁TimeLimit: 10Sec  MemoryLimit: 64MBSubmit: 3481  Solved: 1374[Submit][Status][Discuss]DescriptionN个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前 查看详情

bzoj1483[hnoi2009]梦幻布丁

1483:[HNOI2009]梦幻布丁TimeLimit: 10Sec  MemoryLimit: 64MBSubmit: 3485  Solved: 1376[Submit][Status][Discuss]DescriptionN个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前 查看详情

bzoj1483:[hnoi2009]梦幻布丁

 每次只要修改链头实际代表的颜色即可//Twenty#include<cstdio>#include<cstdlib>#include<iostream>#include<algorithm>#include<cmath>#include<cstring>#include<queue>#include&l 查看详情

bzoj1483:[hnoi2009]梦幻布丁

...每次把小的合并到大的部分,均摊复杂度$O(MlogN)$。 //BZOJ1483//byCydiater//2016.10.25#include<iostream>#include<cstring>#include<cstdlib> 查看详情