#结论#洛谷 3199 [HNOI2009]最小圈
题目
求有向图最小平均权值回路。
\(n\leq 3*10^3,m\leq 10^4\)
分析
设 \(f_k(x)\) 表示从点 \(x\) 出发恰好走 \(k\) 条边的最短路,
那么答案就是 \(\min_{x=1}^n\max_{k=0}^{n-1}\frac{f_n(x)-f_k(x)}{n-k}\)
所以直接 \(O(nm)\) 就可以了,证明见_rqy dalao的博客
0/1分数规划的方法理论应该会T这里就不写了,不过只要任意点都可以作为起点那么初始值都为0就可以了
代码
#include <cstdio>
#include <cctype>
#include <cstring>
#define rr register
using namespace std;
const int N=3411; typedef double db;
int as[N],n,m; db f[N][N],ans=1e15;
struct node{int y; db w; int next;}e[N*3];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void Max(db &x,db y){x=x>y?x:y;}
inline void Min(db &x,db y){x=x<y?x:y;}
signed main(){
n=iut(); m=iut();
for (rr int i=1;i<=m;++i){
rr int x=iut(),y=iut();
rr db w; scanf("%lf",&w);
e[i]=(node){y,w,as[x]},as[x]=i;
}
for (rr int i=1;i<=n;++i){
for (rr int x=1;x<=n;++x) f[i][x]=1e15;
for (rr int x=1;x<=n;++x)
if (f[i-1][x]!=1e15)
for (rr int j=as[x];j;j=e[j].next)
Min(f[i][e[j].y],f[i-1][x]+e[j].w);
}
for (rr int i=1;i<=n;++i){
rr db now=-1e15;
for (rr int j=0;j<n;++j)
Max(now,(f[n][i]-f[j][i])/(n-j));
Min(ans,now);
}
return !printf("%.8lf",ans);
}
0/1分数规划代码
#include <cstdio>
#include <cctype>
#include <cstring>
#define rr register
using namespace std;
const int N=3011; int as[N],n,m; bool v[N]; double dis[N];
struct node{int y; double w; int next;}e[N*5];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline bool dfs(int x,double mid){
v[x]=1;
for (rr int i=as[x];i;i=e[i].next)
if (dis[e[i].y]>dis[x]+e[i].w-mid){
if (v[e[i].y]) return 0;
dis[e[i].y]=dis[x]+e[i].w-mid;
if (!dfs(e[i].y,mid)) return 0;
}
v[x]=0;
return 1;
}
signed main(){
n=iut(); m=iut();
for (rr int i=1;i<=m;++i){
rr int x=iut(),y=iut();
rr double w; scanf("%lf",&w);
e[i]=(node){y,w,as[x]},as[x]=i;
}
for (rr int i=1;i<=n;++i)
e[i+m]=(node){i,0,as[n+1]},as[n+1]=m+i;
rr double l=-5000,r=5000;
while (l+1e-9<r){
rr double mid=(l+r)/2;
for (rr int i=1;i<=n+1;++i) dis[i]=v[i]=0;
if (dfs(n+1,mid)) l=mid;
else r=mid;
}
return !printf("%.8lf",l);
}
#结论#洛谷 3199 [HNOI2009]最小圈的更多相关文章
- 洛谷 P3199 [HNOI2009]最小圈
P3199 [HNOI2009]最小圈 题目背景 如果你能提供题面或者题意简述,请直接在讨论区发帖,感谢你的贡献. 题目描述 对于一张有向图,要你求图中最小圈的平均值最小是多少,即若一个圈经过k个节点 ...
- 洛谷P3199 [HNOI2009]最小圈(01分数规划)
题意 题目链接 Sol 暴力01分数规划可过 标算应该是这个 #include<bits/stdc++.h> #define Pair pair<int, double> #d ...
- 洛谷4951 地震 bzoj1816扑克牌 洛谷3199最小圈 / 01分数规划
洛谷4951 地震 #include<iostream> #include<cstdio> #include<algorithm> #define go(i,a,b ...
- bzoj 1486: [HNOI2009]最小圈 dfs求负环
1486: [HNOI2009]最小圈 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1022 Solved: 487[Submit][Status] ...
- BZOJ 1486: [HNOI2009]最小圈( 二分答案 + dfs判负圈 )
二分答案m, 然后全部边权减掉m, 假如存在负圈, 那么说明有平均值更小的圈存在. 负圈用dfs判断. ------------------------------------------------ ...
- 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 ...
- [HNOI2009]最小圈 (二分答案+负环)
题面:[HNOI2009]最小圈 题目描述: 考虑带权的有向图\(G=(V,E)\)以及\(w:E\rightarrow R\),每条边\(e=(i,j)(i\neq j,i\in V,j\in V) ...
- bzoj千题计划227:bzoj1486: [HNOI2009]最小圈
http://www.lydsy.com/JudgeOnline/problem.php?id=1486 二分答案 dfs版spfa判负环 #include<queue> #include ...
- 【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 最小圈 【01分数规划】
BZOJ1486 HNOI2009 最小圈 Description 应该算是01分数规划的裸板题了吧..但是第一次写还是遇到了一些困难,vis数组不清零之类的 假设一个答案成立,那么一定可以找到一个环 ...
随机推荐
- win32 - MultiByteToWideChar的示例
该函数经常被用来处理UTF-8和ANSI格式的字符串,将它们转换为宽字节(UTF-16) #include <iostream> #include <Windows.h> #i ...
- 解决Spring boot 单元测试,无法读取配置文件问题。
1.启动类上加上@EnableConfigurationProperties 2.springboot版本springboot 2.X版本在单元测试中读取不到yml配置文件的值这是个大坑,在项目中写单 ...
- 如何处理Long类型精度丢失问题?
一.现象与分析: 1.1. 现象 前后端交互,当后端传一些值给前端的时候,如果是long类型,有可能会出现数字太大而前端接收不了(java中的long大于js的number)而导致数据不一致,精度会丢 ...
- 使用Python读取nc数据
在地学领域,nc 格式的文件可谓随处可见,这种文件可以存储多维数字矩阵,同时又封装了自描述信息(例如经纬度.高度层.时间戳.单位等),因此使用起来十分方便,不用担心数据和描述信息分离而导致数据不可用. ...
- 俄罗斯套娃 (Matryoshka) 嵌入模型概述
在这篇博客中,我们将向你介绍俄罗斯套娃嵌入的概念,并解释为什么它们很有用.我们将讨论这些模型在理论上是如何训练的,以及你如何使用 Sentence Transformers 来训练它们. 除此之外,我 ...
- vscode 切换项目快捷键 Alt + Shift + P 插件 Project Manager
vscode 切换项目快捷键 Alt + Shift + P 插件 Project Manager 需求 快速切换同时打开的项目 解决方案 Alt + Shift + P 话说这个插件很早就用了,但是 ...
- linux脚本免密的方法/不用输入密码
第一种方法:使用管道(上一个命令的 stdout 接到下一个命令的 stdin):在脚本首行添加 #!/bin/bashecho password | sudo -S apt-get update 第 ...
- 关于wine乱码问题的解决方法
在我的百度网盘里面,以及U盘备份,里面的Fonts.zip文件, 使用unzip Fonts.zip----linux指令 把这个文件夹里面的所有文件复制到wine的映射目录里面 cp Fonts/* ...
- python的替换函数strip(),replace()和re.sub()实例分析
前记: python是一个非常好用的语言,能够帮忙处理很多日常的耗费体力的事情.今天做一个脚本的时候,遇到了python替换的问题,这里就梳理一下知识点吧. 概念: 1.replace() 基本用法: ...
- autowired循环调用
下面这段代码,表示那你的bean进行了循环调用. org.springframework.beans.factory.BeanCreationException: Error creating bea ...