Luogu3199 HNOI2009 最小圈 分数规划、SPFA
可以发现它的式子是一个分数规划的式子,所以可以二分答案,将所有边权减掉当前二分值之后跑一边$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的更多相关文章
- [HNOI2009]最小圈 分数规划 spfa判负环
[HNOI2009]最小圈 分数规划 spfa判负环 题面 思路难,代码简单. 题目求圈上最小平均值,问题可看为一个0/1规划问题,每个边有\(a[i],b[i]\)两个属性,\(a[i]=w(u,v ...
- 【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,然后再判 ...
- [bzoj1486][HNOI2009]最小圈——分数规划+spfa+负环
题目 传送门 题解 这个题是一个经典的分数规划问题. 把题目形式化地表示,就是 \[Minimize\ \lambda = \frac{\sum W_{i, i+1}}{k}\] 整理一下,就是 \[ ...
- 【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 ...
- 【BZOJ1486】【HNOI2009】最小圈 分数规划 dfs判负环。
链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...
- 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 ...
- BZOJ1486 HNOI2009 最小圈 【01分数规划】
BZOJ1486 HNOI2009 最小圈 Description 应该算是01分数规划的裸板题了吧..但是第一次写还是遇到了一些困难,vis数组不清零之类的 假设一个答案成立,那么一定可以找到一个环 ...
- 【算法】01分数规划 --- HNOI2009最小圈 & APIO2017商旅 & SDOI2017新生舞会
01分数规划:通常的问法是:在一张有 \(n\) 个点,\(m\) 条边的有向图中,每一条边均有其价值 \(v\) 与其代价 \(w\):求在图中的一个环使得这个环上所有的路径的权值和与代价和的比率最 ...
- Bzoj1486/洛谷P3199 最小圈(0/1分数规划+spfa)/(动态规划+结论)
题面 Bzoj 洛谷 题解(0/1分数规划+spfa) 考虑\(0/1\)分数规划,设当前枚举到的答案为\(ans\) 则我们要使(其中\(\forall b_i=1\)) \[ \frac{\sum ...
随机推荐
- JSP内置对象——pageContext对象和config对象
它对应的常用方法有: 现在,我新建一个“pageContext.jsp”页面,可以获得“session_page1.jsp”这个页面中保存的用户名: pageContext.jap: session_ ...
- IOS 多文件上传 Java web端(后台) 使用List<MultipartFile> 接收出现的问题
先上正确的示例: 主要是设置我们的request的content-type为multipart/form-data NSDictionary *param = @{@"assignee&qu ...
- tinypng upload一键压缩上传工具,告别人肉
地址 项目地址:tinypng-upload 有兴趣的可以玩一玩,因为平时经常会用到图片压缩,上传,如果你也觉得很繁琐的话,这个将会解决你的痛点. 关于 tinypng-upload 这是一个基于 e ...
- Maven 安装 on centos7
本文演示如何在CentOS7上安装maven. 1 准备工作 1.1 进入官网下载栏目 http://maven.apache.org/download.cgi 找到下载列表中 Binary tar. ...
- python第九十一天----第十六周作业
实现功能: 1.非编辑模式 可以对每行进行选择,全选,取消,反选 : 2.编辑模式 进入编辑模式时: 如果行被选中,则被选中的行变为可编辑状态,未选中则不改变 退出编辑模式时: 保存所有的 ...
- 简单易懂的程序语言入门小册子(3):基于文本替换的解释器,let表达式,布尔类型,if表达式
let表达式 let表达式用来声明一个变量. 比如我们正在写一个模拟掷骰子游戏的程序. 一个骰子有6个面. 所以这个程序多次用到了6这个数字. 有一天,我们忽然改变主意,要玩12个面的骰子. 于是我们 ...
- linux 系统中用root切换到普通用户时显示的异常如-bash-4.1$
解决办法: 其实就是普通用户的家目录缺少配置文件导致: [root@xxx ~]# su - oldboy -bash-4.1$ 原因是普通用户的家目录下缺少文件: [root@xxx ~]# ls ...
- SQL易错总结1
SQL易错总结1 进阶 select语句.select * 查询所有不规范,写出要查的属性.distinct慎用,性能消耗很大 like 模糊查询 ,空值判断是 is null 单行函数:lower( ...
- linux之在当前目录下按照文件大小进行排序的三种方法
当前目录下按照文件大小排序 [root@test23 script]# ls -lSh 总用量 44K -rw-r--r-- 1 root root 2.4K 12月 8 17:24 test.con ...
- 公式编辑器MathType基本使用方法总结----应付本科毕业论文完全没问题啦^_^
本人计算数学专业毕业,写毕业论文和外文翻译的时候会遇到大量公式需要编辑,而且学校一般都要求用word.但是Word自带的公式编辑器只支持一种字体,当公式中涉及到特殊字体就不太方便了.如果用Latex来 ...