Sightseeing Cows

给出一张图,点数为L,边数P,并给出边的边权\(\{b_i\}\),再给处每个点的点权,求一条起点和终点相同的路径,并使其点权之和除以边权之和最大,注意,路径中点权只能被计算一次,而边权可以重复计算, (2 ≤ L ≤ 1000), (2 ≤ P ≤ 5000)。

显然为分数规划问题,关键在点权与边权不对应上,于是自然的想法是点权移边权,而一条起点与终点相同的路径即一个联通分量,所以问题现在在于点权移边权后只对环成立,而不对联通分量成立,于是考虑证明联通分量对结果没有影响,于是设一个大环它的路径长\(b_1\),点权\(a_1\),一个小环路径长\(b_2\),点权\(a_2\),设他们是套在一起的环,所以会有重叠的地方。

不难得知,大环的比率为\(\frac{a_1}{b_1}\),小环比率\(\frac{a_2}{b_2}\),而套在一起的环比率仍按照不去点权算为\(\frac{a_1+a_2}{b_1+b_2}\),由分数三角不等式结论,我们知道\(\frac{a_1+a_2}{b_1+b_2}\leq max(\frac{a_1}{b_1},\frac{a_2}{b_2})\)

所以我们可以知道实际上环套环,即联通分量对结果没有影响,于是移点下边,接下来照着最优比率环的基本套路即可,但是注意此处要算出一个具体的比较大的ans很难做到,于是迭代就不能使用了,但是你的聪明才智或许能想到一种好的解决办法。

参考代码:

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#define il inline
#define ri register
#define exact 0.000001
using namespace std;
struct point{
int next,to,a,b;
double c;
}ar[5001];int at;
bool is[1001];
double dis[10001];
int f[1001],head[1001],n,
t1[4000001],tot[1001];
il bool check(double);
il double dfs(double,double);
il void link(int,int,int,int),read(int&);
int main(){
int m,i,j,k;
read(n),read(m);
for(i=1;i<=n;++i)read(f[i]);
while(m--)read(i),read(j),read(k),
link(i,j,f[j],k);
printf("%.2lf",dfs(0,100));
return 0;
}
il bool check(double x){
int i,h(0),t(0);
memset(is,0,sizeof(is)),memset(tot,0,sizeof(tot)),
memset(dis,0,sizeof(dis));
for(i=1;i<=n;++i)t1[++t]=i;
for(i=1;i<=at;++i)
ar[i].c=ar[i].b*x-ar[i].a;
while(h<t){
++h,is[t1[h]]|=true;
for(i=head[t1[h]];i;i=ar[i].next)
if(ar[i].c+dis[t1[h]]<dis[ar[i].to]){
dis[ar[i].to]=ar[i].c+dis[t1[h]];
if(is[ar[i].to]){
t1[++t]=ar[i].to,is[ar[i].to]&=false;
if(++tot[ar[i].to]>=n)return true;
}
}
}return false;
}
il double dfs(double l,double r){
double mid;
while(r-l>exact){
mid=(l+r)/2;
if(check(mid))l=mid+exact;
else r=mid-exact;
}return (l+r)/2;
}
il void read(int &x){
x&=0;ri char c;while(c=getchar(),c<'0'||c>'9');
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
}
il void link(int x,int y,int a,int b){
ar[++at].a=a,ar[at].b=b,ar[at].to=y;
ar[at].next=head[x],head[x]=at;
}

最新文章

  1. NHibernate系列文章二十二:NHibernate查询之HQL查询(附程序下载)
  2. 开源工作流引擎CCFlow 学习专区
  3. JS根据服务器时间倒计时
  4. [团队项目]第二个冲刺 看板和燃尽图 Sprint2 6.8/6.9/6.10/6.11/6.12/6.13/6.14
  5. 下载安装APK
  6. 为什么wait(),notify()和notifyAll()必须在同步块或同步方法中调
  7. 兼容PHP和Java的des加密解密代码分享
  8. 【转】android MSM8974 上DeviceTree简介----不错
  9. poj1703--Find them, Catch them(并查集应用)
  10. oracle正则表达式regexp_like的用法详解
  11. mac 电脑配置cordova
  12. Nginx简单配置,部分来源于网络
  13. vr &amp; obv
  14. android usb挂载分析---vold处理内核消息
  15. 转载|chrome developer tool—— 断点调试篇
  16. 【转】搭建自己的 sentry 服务
  17. SpringBoot之旅第四篇-web开发
  18. SQL SERVER服务器登录名、角色、数据库用户、角色、架构的关系
  19. Python学习之旅(三十)
  20. Hue中hive(hive cli)查询结果中显示列名,不带表名

热门文章

  1. Java io简单总结
  2. Comet OJ - 2019 六一欢乐赛
  3. Codeforces 1166A - Silent Classroom
  4. 使用反射机制,获取 ArrayList 的容量大小
  5. 推荐5本纯Java技术书,你看过几本?
  6. Python匹马行天下之初识python!
  7. linux安装openoffice,并解决中文乱码
  8. RDD运行原理
  9. shell 脚本 功能性语句 read,expr,test
  10. 【CSP-S/J 2019】初赛注意事项