PS:此题数组名皆引用:戳我

题目大意:有n个点m条有向边的图,边上有花费,点上有收益,点可以多次经过,但是收益不叠加,边也可以多次经过,但是费用叠加。求一个环使得收益和/花费和最大,输出这个比值。

显然这就是经典的分数规划题啊,就是最优比率环,那么就二分答案,将所有边(u,v)的边权改为【v的点权-(u,v)原边权*mid】(因为d[i]=a[i]-L*b[i]),然后判一下是否有正环,有的话就说明有更优的答案(F(L)=sigma(a[i]*x[i])-L*sigma(b[i]*x[i])>0即sigma(a[i]*x[i])/sigma(b[i]*x[i])>L),缩小范围继续二分。判正环有够别扭的,那就全部改成相反数然后判负环吧233333

代码如下:

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<queue>
using namespace std;
struct zs{int too,pre;double dis;}e[];
struct poi{int pos;double dis;};
priority_queue<poi>q;
bool operator <(poi a,poi b){return a.dis-b.dis>1e-;}
int n,m,x,y,now,tot,num[],last[];
bool v[];
double l,r,mid,dis[],fun[];
bool spfa(int x)
{
for(int i=;i<=n;i++)dis[i]=;v[x]=true;q.push((poi){,});dis[]=;
while(!q.empty())
{
int i,too;
for(i=last[now=q.top().pos],too=e[i].too,q.pop();i;i=e[i].pre,too=e[i].too)
{
double dist=e[i].dis*mid-fun[too];
if(dis[too]-dis[now]-dist>1e-)
{
dis[too]=dis[now]+dist;
if(!v[too])v[too]=,q.push((poi){too,e[i].dis}),num[too]++;
if(num[too]>)return ;
}
}
v[now]=;
}
return ;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=;i<=n;i++)scanf("%lf",&fun[i]);
for(int i=;i<=m;i++)
{
scanf("%d %d %lf",&x,&y,&e[++tot].dis);
e[tot].too=y;e[tot].pre=last[x];last[x]=tot;
}
l=;r=;
while(r-l>1e-)
{
memset(v,,sizeof(v));
memset(num,,sizeof(num));
mid=(l+r)/;
if(spfa())l=mid;
else r=mid;
}
printf("%.2lf",l);
}

最新文章

  1. Android studio安装
  2. 四大组件之ContentProvider
  3. HTTP Status 500 - An exception occurred processing at line 35
  4. 我被SQL注入撞了一下腰
  5. Match类解析
  6. GT-随身调详细教程
  7. 使用 IdentityServer4 实现 OAuth 2.0 与 OpenID Connect 服务
  8. gluster 卷的类型及创建方法
  9. Java虚拟机(二)对象的创建与OOP-Klass模型
  10. Redis系列三:reids常用命令
  11. 《图说VR入门》——DeepoonVR的大鹏(陀螺仪)枪
  12. 基础知识《十一》Java异常处理总结
  13. 解决运行Maven是报错:No goals have been specified for this build
  14. jQuery使用正则判断是否含有非法字符
  15. [NOI2014]动物园(kmp)
  16. weblogic、hibernate 包冲突
  17. Apache网站服务
  18. 彻底解决maven Cannot change version of project facet Dynamic Web Module to 3.0?
  19. Django-Ajax基础知识
  20. UINavigationController + UIScrollView组合,视图尺寸的设置探秘(一)

热门文章

  1. jmeter基础之录制篇
  2. 定时任务 linux crontab 学习整理
  3. 【算法分析】如何理解快慢指针?判断linked list中是否有环、找到环的起始节点位置。以Leetcode 141. Linked List Cycle, 142. Linked List Cycle II 为例Python实现
  4. C struct中的位域 bitfield
  5. 业务迁移---redis
  6. wwnjld第二轮迭代测试报告
  7. 下载 编译 Android源代码 和 Android kernel源代码
  8. (转)Android SearchView 搜索框
  9. C#创建Window服务图解,安装、配置、以及C#操作Windows服务
  10. 【Docker 命令】 - search 命令