不懂01分数规划的可以先看大佬博客~ 传送门

01分数规划,即给定模型求sum(ai)/sum(bi)的最值;
我们可以改变一下式子的形态:
sum(ai)/sum(bi)>=L
=sum(ai)-L*sum(bi)>=0
所以我们可以通过二分判断L的取值;

最重要的还是要构造一个具有单调性的式子使得可以二分求解
看题啦~

小澳的葫芦

题目描述
葫芦世界有n个葫芦,标号为 1−n。n个葫芦由m条藤连接,每条藤连接了两个葫芦,这些藤构成了一张有向无环图。小澳爬过每条藤都会消耗一定的能量。
小澳站在1号葫芦上(你可以认为葫芦非常大,可以承受小澳的体重),他想沿着藤爬到n号葫芦上,其中每个葫芦只经过一次。
小澳找到一条路径,使得消耗的能量与经过的葫芦数的比值最小。
输入
输入第一行两个正整数 n,m,分别表示葫芦的个数和藤数。
接下来m行,每行三个正整数 u,v,w,描述一条藤,表示这条藤由u连向v,小澳爬过这条藤需要消耗w点能量。
输出
一行一个实数,表示答案(误差不超过 10^-3)。
样例输入 Copy
4 6
1 2 1
2 4 6
1 3 2
3 4 4
2 3 3
1 4 8
样例输出 Copy
2.000
提示
对于所有数据,小澳爬过每条藤消耗的能量不会超过 10^3,且一定存在一条从1到n的路径。

题意:

给出n个点m条边的有向无环图,求1~n的最短路径的权值之和与所经过点个数的最小比值。
思路:

这里借鉴一下01分数规划的思想,我们设答案为x,可以推出
对于一条经过k边的路径有 (w1+w2+w3+……+wk)/k >=x;
即 w1+w2+w3+……+wk >= k*x
我们把x拆开后移到左边 (w1-x)+(w2-x)+(w3-x)+…+(wk-x)>=0

满足单调性~

还有一点就是需要

另建一个起点0,连接一条0到1长度为0的边,就此将问题转化为长度和边数最小比值。这个问题的求解需要分数规划。
于是就得到了这样一个算法:
二分答案x,每次将每一条边的权值减去x求最短路,判断1~n的最短路是否大于0:若大于0,则说明答案ans>x;否则说明ans<x。

代码:要注意距离和权值的存储必须使用double类型

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define I_int ll
#define inf 0x3f3f3f3f
inline ll read()
{ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
char F[200];
inline void out(I_int x) {if (x == 0) return (void) (putchar('0'));I_int tmp = x > 0 ? x : -x;if (x < 0) putchar('-');int cnt = 0;while (tmp > 0) {F[cnt++] = tmp % 10 + '0';tmp /= 10;}while (cnt > 0) putchar(F[--cnt]);//cout<<" ";
}
const int maxn=1e6+7;
const double eps=1e-12;
double w[maxn];
int h[maxn],e[maxn],ne[maxn],idx;//邻接表存图
double d[maxn];//保存最短距离
bool st[maxn];//判断是否已经确定最短路
int n,m;
void add(int a,int b,int c){e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
bool check(double x){for(int i=0;i<idx;i++) w[i]-=x;//根据构造出来的式子来进行二分检验 for(int i=1;i<=n;i++) d[i]=1e9+7,st[i]=0;d[0]=0;queue<int>q;q.push(0);st[0]=1;//SPFAwhile(q.size()){int t=q.front();q.pop();st[t]=0;for(int i=h[t];~i;i=ne[i]){int j=e[i];if(d[j]>d[t]+w[i]){d[j]=d[t]+w[i];if(!st[j]){q.push(j);st[j]=1;}}}} for(int i=0;i<idx;i++) w[i]+=x;//恢复原状 return d[n]-eps<0;
}
void AC(){n=read();m=read();memset(h,-1,sizeof h);int u, v,w;add(0,1,0);for(int i=1;i<=m;i++){u=read();v=read();w=read();//cin>>u>>v>>w;add(u,v,w); }double l=0,r=maxn,res;//求最小值 //while(r-l>eps)while(l+eps<r){double mid=(l+r)/2.0;if(check(mid)) res=mid,r=mid;//满足题意,还可以更小,区间左移 else l=mid;//不满足题意,区间右移 }printf("%.3lf",res);
}
int main(){AC();return 0;
}

接近自闭,还有个Graph在补

参考资料:
01分数规划 - 神之右大臣 - 博客园
三校联训 小澳的葫芦(calabash) 题解 - 神之右大臣 - 博客园

UPC 小澳的葫芦 (最短路+01分数规划 )相关推荐

  1. 小澳的葫芦(最短路)

    小澳的葫芦 时间限制: 1 Sec 内存限制: 128 MB 题目描述 葫芦世界有n个葫芦,标号为 1−n.n个葫芦由m条藤连接,每条藤连接了两个葫芦,这些藤构成了一张有向无环图.小澳爬过每条藤都会消 ...

  2. 01分数规划 东师oj3582: 小澳的葫芦

    题目描述 题目描述 小澳最喜欢的歌曲就是<葫芦娃>. 一日表演唱歌,他尽了洪荒之力,唱响心中圣歌. 随之,小澳进入了葫芦世界. 葫芦世界有n个葫芦,标号为1~ n.n个葫芦由m条藤连接,每 ...

  3. 三校联训 小澳的葫芦(calabash) 题解

    题面: 小澳的葫芦 [ 题目描述] 小澳最喜欢的歌曲就是<葫芦娃>. 一日表演唱歌,他尽了洪荒之力,唱响心中圣歌. 随之,小澳进入了葫芦世界. 葫芦世界有 n 个葫芦,标号为 1~ n. ...

  4. 最小比例生成树 小澳的葫芦

    最小比例生成树 最小比例生成树:指路径总长与经过点数比值的最小值 小澳的葫芦 (calabash.cpp/c/pas ) [题目描述 ] 小澳最喜欢的歌曲就是<葫芦娃>. 一日表演唱歌,他 ...

  5. 模板 - 判断负环(超时高效优化技巧)、01分数规划

    整理的算法模板合集: ACM模板 判断负环 判正环求最长路,判负环求最短路 int n; // 总点数 int h[N], w[N], e[N], ne[N], idx; // 邻接表存储所有边 in ...

  6. 二分+01分数规划+最大化平均值 Dropping tests POJ - 2976

    题意: 给你若n个分数,分子a[i]a[i]a[i],分母b[i]b[i]b[i],使满足公式100⋅∑i=1nai∑i=1nbi100\cdot\tfrac{\sum_{i=1}^{n} a_{i} ...

  7. 点分治问题 ----------- luoguP2942 [WC2010]重建计划 [点分治 + bfs + 单调队列 + 预处理建树 + 二分 + 01分数规划]

    题目链接 解题思路: 1.对于这个Avgvalue=∑e∈sv(e)∣s∣Avgvalue = \frac{\sum_{e\in s}v(e)}{|s|}Avgvalue=∣s∣∑e∈s​v(e)​ ...

  8. 解题报告:AcWing 1165. 单词环(01分数规划、hash、经验优化)

    本题的关键在于: 建图 01分数规划 本题的数据过大,如果直接spfa判断会TLE,因此我们使用经验优化,就是如果所有的点入队的次数过多,比如大于100000,那么我们直接认为它是存在正环的.(免去T ...

  9. 【图论专题】负环与01分数规划

    整理的算法模板合集: ACM模板 题目列表: 题目 算法 AcWing 904. 虫洞 spfa判负环 AcWing 361. 观光奶牛 最优比率环.01分数规划 AcWing 1165. 单词环 0 ...

最新文章

  1. Node.js express 之mongoose 从异步回调函数返回值,类似于同步
  2. 把自己的文件做成ISO镜像文件
  3. 李开复给中国学生的第六封信:选择的智慧
  4. 数据库性能瓶颈的出现
  5. 《剑指offer》第四十三题(从1到n整数中1出现的次数)
  6. 索尼XA3曝光:同样是21:9屏幕 带鱼手机屏或成新潮流
  7. HDU 1422 重温世界杯 (dp)
  8. BAT大牛这样搞Python,真是绝了
  9. linux oracle查询乱码问题,linux中oracle中文乱码解决方法
  10. jave类命名_Java重命名文件– Jave移动文件
  11. STM32电机库5.4开源注释 KEIL工程文件 辅助理解S STM32电机库5.4开源注释
  12. vue后台管理做适配的最佳方案,你知道吗
  13. 清除各个浏览器保存的账号密码信息
  14. 浪潮配置ipim_浪潮服务器管理口IP设置_IPMI设置
  15. Qt Style Sheet实践(二):组合框QComboBox的定制
  16. 解读国内外园艺机器人的应用现状
  17. 黄天不负有心人,拥有属于自己的LOGO
  18. 使用SPSS进行曲线估算分析
  19. SQL 各种锁等待类型 wait type--sys.dm_os_wait_stats 表
  20. 安装系统时出现“ 计算机意外地重新启动或遇到错误 ”

热门文章

  1. 技术人最基本投资建议
  2. 机器学习:神经网络中的激活函数
  3. 计算机网络二分法划分网络,三种经典复杂网络社区结构划分算法研究_GN算法
  4. Uber数据泄露事件本可以使用区块链…
  5. 驭势内参 | 请用一个周末的时间,来扫盲“无人驾驶”
  6. Qt 实现录音在线转文字
  7. 接口的方式获取bing必应每天壁纸
  8. 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(8月8日~8月14日)...
  9. yocs_velocity_smoother速度平滑配置与使用
  10. Premiere Pro 2022带来离线语音转文本教程