题目背景

如果你能提供题面或者题意简述,请直接在讨论区发帖,感谢你的贡献。

题目描述

对于一张有向图,要你求图中最小圈的平均值最小是多少,即若一个圈经过k个节点,那么一个圈的平均值为圈上k条边权的和除以k,现要求其中的最小值

输入输出格式

输入格式:

第一行2个正整数,分别为n和m

以下m行,每行3个数,表示边连接的信息,

输出格式:

一行一个数,表示最小圈的值,保留8位小数。

输入输出样例

输入样例#1:
复制

4 5
1 2 5
2 3 5
3 1 5
2 4 3
4 1 3
输出样例#1: 复制

3.66666667

说明

若设边权为vvv,那么n≤3000,m≤10000,v≤50000n\le 3000,m\le 10000,v\le 50000n≤3000,m≤10000,v≤50000

题解转自NaVi_Awson巨佬博客(快去访问 http://www.cnblogs.com/NaVi-Awson/p/7641518.html

题解

最小化平均值($01$分数规划)。

使用二分求解。对于一个猜测的$mid$,只需判断是否存在平均值小于$mid$的回路。

如何判断?

假设存在一个包含$k$条边的回路,回路上各边权值为$w_1$ ,$w_2$ ,$...$,$w_k$ ,那么平均值小于$midv$意味着:

$$w_1 +w_2 +...+w_k <k×mid$$

即:

$$(w_1 -mid)+(w_2 -mid)+...+(w_k -mid)<0$$

换句话说,只要把边$(a,b)$的权$w(a,b)$改成$w(a,b)-mid$,再判断新图中是否有负环即可。

存在负环,那么之前的不等式满足,即存在着更小的平均值,$r=mid$;不存在,$l=mid$。

不要脸的贴自己的代码:

//It is coded by Ning_Mew on 10.26
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;
const double CDN=0.000000001;
int n,m;
double L,R,mid;
double dist[+];
int head[+],t;
struct Edge{
int next,to;
double dis;
}edge[+];
void add(int from,int to,double dis){
edge[++t].next=head[from];
edge[t].to=to;
edge[t].dis=dis;
head[from]=t;
}
bool vis[+];
void clear(){
memset(vis,false,sizeof(vis));
memset(dist,,sizeof(dist));
return;
}
bool SPFA(int u){
vis[u]=true;
for(int i=head[u];i!=;i=edge[i].next){
int v=edge[i].to;
if(dist[v]>dist[u]+edge[i].dis-mid){
if(vis[v]){vis[u]=false;return true;}
dist[v]=dist[u]+edge[i].dis-mid;
if(SPFA(v)){vis[u]=false;return true;}
}
}
vis[u]=false;return false;
}
bool check(){
clear();
for(int i=;i<=n;i++){if(SPFA(i))return true;}
return false;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
R=max(R,(double)z);
}
while(L+CDN<R){
mid=(L+R)/;
if(check()){R=mid;}
else L=mid;
}
printf("%0.8lf",(L+R)/);
return ;
}

【题解】 [HNOI2009] 最小圈 (01分数规划,二分答案,负环)的更多相关文章

  1. [HNOI2009]最小圈(分数规划+SPFA判负环)

    题解:求环长比环边个数的最小值,即求min{Σw[i]/|S|},其中i∈S.这题一眼二分,然后可以把边的个数进行转化,假设存在Σw[i]/|S|<=k,则Σw[i]-k|S|<=0,即Σ ...

  2. 洛谷P3199 [HNOI2009]最小圈(01分数规划)

    题意 题目链接 Sol 暴力01分数规划可过 标算应该是这个 #include<bits/stdc++.h> #define Pair pair<int, double> #d ...

  3. P3199 [HNOI2009]最小圈 01分数规划

    裸题,第二个权值是自己点的个数.二分之后用spfa判负环就行了. 题目描述 考虑带权的有向图G=(V,E)G=(V,E)G=(V,E)以及w:E→Rw:E\rightarrow Rw:E→R,每条边e ...

  4. BZOJ 1486: [HNOI2009]最小圈 [01分数规划]

    裸题...平均权值最小的环.... 注意$dfs-spfa$时$dfs(cl)$...不要写成$dfs(u)$ #include <iostream> #include <cstdi ...

  5. 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 ...

  6. 2018.09.24 bzoj1486: [HNOI2009]最小圈(01分数规划+spfa判负环)

    传送门 答案只保留了6位小数WA了两次233. 这就是一个简单的01分数规划. 直接二分答案,根据图中有没有负环存在进行调整. 注意二分边界. 另外dfs版spfa判负环真心快很多. 代码: #inc ...

  7. BZOJ 1486 最小圈(01分数规划)

    好像是很normal的01分数规划题.最小比率生成环. u(c)=sigma(E)/k.转化一下就是k*u(c)=sigma(E). sigma(E-u(c))=0. 所以答案对于这个式子是有单调性的 ...

  8. POJ3621Sightseeing Cows[01分数规划 spfa(dfs)负环 ]

    Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9703   Accepted: 3299 ...

  9. bzoj3597[Scoi2014]方伯伯运椰子 01分数规划+spfa判负环

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 594  Solved: 360[Submit][Statu ...

  10. 洛谷4951 地震 bzoj1816扑克牌 洛谷3199最小圈 / 01分数规划

    洛谷4951 地震 #include<iostream> #include<cstdio> #include<algorithm> #define go(i,a,b ...

随机推荐

  1. sql的一个查询,情景:a表中存在的数据,且在b表中不存在 (not in,not exists

    这里需要强调的是b表中关联字段的值是唯一的这种情况,并且b表尽量是列举类型的,意味着表比较小. ==================== 准备数据: 1. 建两个类似表,test1,test2,只有i ...

  2. Scala--数组相关操作

    一.定长数组 Array定长数组,访问数组元素需要通过()  数组长度是固定的,但是内容可以修改 val nums = new Array[Int](10) //长度为10的int数组 初始化为0 v ...

  3. 20155317王新玮《网络对抗技术》实验9 web安全基础实践

    20155317王新玮<网络对抗技术>实验9 web安全基础实践 一.实验准备 1.0 实验目标和内容 Web前端HTML.能正常安装.启停Apache.理解HTML,理解表单,理解GET ...

  4. MySQL优化:explain using temporary

    什么时候会使用临时表:group/order没设计好的时候 1.order没用索引 2.order用了索引, 但不是和where相同的索引 3.order用了两个索引, 但不是联合索引 4.order ...

  5. 汇编 REPE/REPZ 指令,CMPSB指令

    知识点: REPE/REPZ 指令 CMPSB 指令 一.CMPSB //cmp //sub //SCASB//scasw//scasd cmp byte ptr [edi],al //对标志位的 ...

  6. *args和**kwargs在python中的作用

    我发现PYTHON新手在理解*args和**kwargs这两个魔法变量的时候有些困难.他们到底是什么呢? 首先,我先告诉大家一件事情,完整地写*args和**kwargs是不必要的,我们可以只写*和* ...

  7. effective c++ 笔记 (23-25)

    //---------------------------15/04/08---------------------------- //#23   宁以non_member.non_friend替换m ...

  8. stl源码剖析 详细学习笔记 算法(5)

    //---------------------------15/04/01---------------------------- //inplace_merge(要求有序) template< ...

  9. DelayQueue 订单限时支付实例

    1.订单实体 package com.zy.entity; import java.util.Date; import java.util.concurrent.Delayed; import jav ...

  10. rabbitMQ教程(三)一篇文章看懂rabbitMQ

    一.rabbitMQ是什么: RabbitMQ,遵循AMQP协议,由内在高并发的erlanng语言开发,用在实时的对可靠性要求比较高的消息传递上. 学过websocket的来理解rabbitMQ应该是 ...