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;
}
Sightseeing Cows的更多相关文章
- 【POJ3621】Sightseeing Cows
Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8331 Accepted: 2791 ...
- Sightseeing Cows(最优比率环)
Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8915 Accepted: 3000 ...
- P2868 [USACO07DEC]观光奶牛Sightseeing Cows
P2868 [USACO07DEC]观光奶牛Sightseeing Cows [](https://www.cnblogs.com/images/cnblogs_com/Tony-Double-Sky ...
- 【POJ3621】Sightseeing Cows 分数规划
[POJ3621]Sightseeing Cows 题意:在给定的一个图上寻找一个环路,使得总欢乐值(经过的点权值之和)/ 总时间(经过的边权值之和)最大. 题解:显然是分数规划,二分答案ans,将每 ...
- 【POJ3621】【洛谷2868】Sightseeing Cows(分数规划)
[POJ3621][洛谷2868]Sightseeing Cows(分数规划) 题面 Vjudge 洛谷 大意: 在有向图图中选出一个环,使得这个环的点权\(/\)边权最大 题解 分数规划 二分答案之 ...
- POJ 3621 Sightseeing Cows 【01分数规划+spfa判正环】
题目链接:http://poj.org/problem?id=3621 Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total ...
- POJ 3621 Sightseeing Cows(最优比例环+SPFA检测)
Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10306 Accepted: 3519 ...
- 洛谷P2868 [USACO07DEC]观光奶牛Sightseeing Cows
P2868 [USACO07DEC]观光奶牛Sightseeing Cows 题目描述 Farmer John has decided to reward his cows for their har ...
- POJ3621 Sightseeing Cows 最优比率环 二分法
题目链接:http://poj.org/problem?id=3621 Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total ...
- [USACO07DEC]Sightseeing Cows(负环,0/1分数规划)
[USACO07DEC]Sightseeing Cows Description Farmer John has decided to reward his cows for their hard w ...
随机推荐
- IOS自动化打包介绍
IOS自动化打包介绍 标签: app打包 , Ios打包 , iphone打包 , iphone自动化打渠道包 分类:无线客户端技术, 贴吧技术 摘要 随着苹果手持设备用户的不断增加,ios应 ...
- sqlserver 调优(二)
良好的系统和数据库设计,优质的SQL编写,合适的数据表索引设计,甚至各种硬件因素:网络性能.服务器的性能.操作系统的性能,甚至网卡.交换机等.这篇文章主要讲到如何改善SQL语句,还将有另一篇讨论如何改 ...
- 本地 win7 与虚拟机Centos7 ping互通和Centos7 上网设置
VM 12 安装虚拟机我就不表示了 很简单网上找找 一 .虚拟机设置 1.修改使用了 VMWare 12 虚拟机,Oracle VM 用得有点晕 2.配置VM 的NET环境 3.在VMware虚拟机任 ...
- 【CF516D】Drazil and Morning Exercise
题目 首先我们知道,在树上距离一个点最远的点一定是直径的两个端点之一 首先两遍\(\rm dfs\)把直径求出来,定义\(d(u)\)表示点\(u\)距离其最远点的距离,有了直径我们就能求出\(d\) ...
- javascript字符串方法学习汇总
1.charAt(index) charAt(index):返回字符串中指定位置的字符 var str = 'abcdefghi'; console.log(str.charAt()); // 输出 ...
- JS鼠标经过
<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>菜鸟 ...
- leetcode-216-组合总和③
题目描述: 方法一:回溯 class Solution: def combinationSum3(self, k: int, n: int) -> List[List[int]]: res = ...
- 视频云肖长杰:视频AI科技助力短视频生态
人工智能技术是当今炙手可热的技术领域,它在制造.家居.零售.交通.安防等行业的应用已经是大势所趋.在本月云栖Techday音视频技术沙龙中,阿里云视频云产品专家肖长杰为我们分享了一些AI技术在视频中应 ...
- thinkphp 链接数据库
ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db类进行操作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库驱动来处理.目前的数据 ...
- thinkphp ajax返回
ThinkPHP可以很好的支持AJAX请求,系统的\Think\Controller类提供了ajaxReturn方法用于AJAX调用后返回数据给客户端.并且支持JSON.JSONP.XML和EVAL四 ...