Sightseeing Cows
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 8915   Accepted: 3000

Description

Farmer John has decided to reward his cows for their hard work by taking them on a tour of the big city! The cows must decide how best to spend their free time.

Fortunately, they have a detailed city map showing the L (2 ≤ L ≤ 1000) major landmarks (conveniently numbered 1.. L) and the P (2 ≤ P ≤ 5000) unidirectional cow paths that join them. Farmer John will drive the cows to a starting landmark of their choice, from which they will walk along the cow paths to a series of other landmarks, ending back at their starting landmark where Farmer John will pick them up and take them back to the farm. Because space in the city is at a premium, the cow paths are very narrow and so travel along each cow path is only allowed in one fixed direction.

While the cows may spend as much time as they like in the city, they do tend to get bored easily. Visiting each new landmark is fun, but walking between them takes time. The cows know the exact fun values Fi (1 ≤ Fi ≤ 1000) for each landmark i.

The cows also know about the cowpaths. Cowpath i connects landmark L1i to L2i (in the direction L1i -> L2i ) and requires time Ti (1 ≤ Ti ≤ 1000) to traverse.

In order to have the best possible day off, the cows want to maximize the average fun value per unit time of their trip. Of course, the landmarks are only fun the first time they are visited; the cows may pass through the landmark more than once, but they do not perceive its fun value again. Furthermore, Farmer John is making the cows visit at least two landmarks, so that they get some exercise during their day off.

Help the cows find the maximum fun value per unit time that they can achieve.

Input

* Line 1: Two space-separated integers: L and P
* Lines 2..L+1: Line i+1 contains a single one integer: Fi
* Lines L+2..L+P+1: Line L+i+1 describes cow path i with three space-separated integers: L1i , L2i , and Ti

Output

* Line 1: A single number given to two decimal places (do not perform explicit rounding), the maximum possible average fun per unit time, or 0 if the cows cannot plan any trip at all in accordance with the above rules.

Sample Input

5 7
30
10
10
5
10
1 2 3
2 3 2
3 4 5
3 5 2
4 5 5
5 1 3
5 2 2

Sample Output

6.00
题解:
题意就是,这个人带牛旅行,旅行每个城市会有幸福度,通过每个城市会花费时间,让找平均每秒的最大幸福度;
最短路01分数规划,也就是最优比率环问题;刚开始用了Bellman各种超时,换了SPFA也是,最后把INF改大了,SPFA过了,最后想想BELLMAN的时间复杂度N*M又改了种写法,就各种wa了,真心疲惫;
SPFA:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define mem(x,y) memset(x,y,sizeof(x))
using namespace std;
const int INF=10000000000000;
typedef long long LL;
const int MAXN=1010;
const int MAXM=100010;
/*struct Node{
int u,v;
double t;
};
Node dt[MAXM];*/
struct Edge{
int from,to,next,t;
};
Edge edg[MAXM];
int head[MAXM];
int edgnum;
void add(int u,int v,int t){
Edge E={u,v,head[u],t};
edg[edgnum]=E;
head[u]=edgnum++;
}
int L,P;
double hp[MAXN],dis[MAXN];
int usd[MAXN],vis[MAXN];
/*void add(int u,int v,double t){
Node E={u,v,t};
dt[edgnum++]=E;
}*/
//double R;
/*bool Bellman(){
mem(dis,INF);
mem(usd,0);
dis[1]=0;
while(1){
int temp=0;
for(int j=0;j<edgnum;j++){
int u=dt[j].u,v=dt[j].v;
double t=dt[j].t;
//dis[v]=min(dis[v],dis[u]+R*t-hp[u]);//应该是R*t-hp[u];
if(dis[v]>dis[u]+R*t-hp[u])usd[v]++,dis[v]=dis[u]+R*t-hp[u],temp=1;
if(usd[v]>L)return false;
}
if(!temp)return true;
}
}*/
bool SPFA(double R){
queue<int>dl;
while(!dl.empty())dl.pop();
for(int i=1;i<=L;i++){
dis[i]=INF;
vis[i]=0;
usd[i]=0;
}
dl.push(1);
vis[1]=1;
usd[1]++;
dis[1]=0;
while(!dl.empty()){
int u=dl.front();
dl.pop();
vis[u]=0;
for(int i=head[u];i!=-1;i=edg[i].next){
int v=edg[i].to,t=edg[i].t;
if(dis[v]>dis[u]+R*t-hp[u]){
dis[v]=dis[u]+R*t-hp[u];
if(!vis[v]){
vis[v]=1;
usd[v]++;
dl.push(v);
// printf("%d\n",usd[v]);
if(usd[v]>=L)return false;
}
}
}
}
return true;
}
int main(){
int a,b;
int c;
while(~scanf("%d%d",&L,&P)){
edgnum=0;
double mih=INF,mxh=-INF;
int mit=INF,mxt=-INF;
mem(head,-1);
for(int i=1;i<=L;i++){
scanf("%lf",hp+i);
mih=min(mih,hp[i]);
mxh=max(mxh,hp[i]);
}
while(P--){
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
mit=min(mit,c);
mxt=max(mxt,c);
}
double l=mih/mxt,r=mxh/mit;
// printf("%f %f\n",l,r);
double R;
while(r-l>=0.001){
R=(l+r)/2;
if(SPFA(R))r=R;
else l=R;
}
printf("%.2f\n",l);
}
return 0;
}

  

  Bellman还在wa,贴上求大神帮忙看看;

wa代码:

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define mem(x,y) memset(x,y,sizeof(x))
using namespace std;
const int INF=;
typedef long long LL;
const int MAXN=;
const int MAXM=;
struct Node{
int u,v;
int t;
};
Node dt[MAXM];
/*struct Edge{
int from,to,next,t;
};
Edge edg[MAXM];
int head[MAXM];*/
int edgnum;
/*void add(int u,int v,int t){
Edge E={u,v,head[u],t};
edg[edgnum]=E;
head[u]=edgnum++;
}*/
int L,P;
double hp[MAXN],dis[MAXN];
int usd[MAXN],vis[MAXN];
void add(int u,int v,int t){
Node E={u,v,t};
dt[edgnum++]=E;
}
//double R;
bool Bellman(double R){
for(int i=;i<=L;i++){
usd[i]=;
dis[i]=INF;
}
dis[]=;
usd[]++;
while(){
int temp=;
for(int j=;j<edgnum;j++){
int u=dt[j].u,v=dt[j].v;
int t=dt[j].t;
//dis[v]=min(dis[v],dis[u]+R*t-hp[u]);//应该是R*t-hp[u];
if(dis[v]>dis[u]+R*t-hp[u])dis[v]=dis[u]+R*t-hp[u],temp=,usd[v]++;
if(usd[v]>=L)return false;
}
if(!temp)return true;
}
/*for(int j=0;j<edgnum;j++){
int u=dt[j].u,v=dt[j].v;
int t=dt[j].t;
if(dis[v]>dis[u]+R*t-hp[u])return false;
}
return true;*/
}
/*bool SPFA(double R){
queue<int>dl;
while(!dl.empty())dl.pop();
for(int i=1;i<=L;i++){
dis[i]=INF;
vis[i]=0;
usd[i]=0;
}
dl.push(1);
vis[1]=1;
usd[1]++;
dis[1]=0;
while(!dl.empty()){
int u=dl.front();
dl.pop();
vis[u]=0;
for(int i=head[u];i!=-1;i=edg[i].next){
int v=edg[i].to,t=edg[i].t;
if(dis[v]>dis[u]+R*t-hp[u]){
dis[v]=dis[u]+R*t-hp[u];
if(!vis[v]){
vis[v]=1;
usd[v]++;
dl.push(v);
// printf("%d\n",usd[v]);
if(usd[v]>=L)return false;
}
}
}
}
return true;
}*/
int main(){
int a,b;
int c;
while(~scanf("%d%d",&L,&P)){
edgnum=;
// double mih=INF,mxh=-INF,mit=INF,mxt=-INF;
//mem(head,-1);
for(int i=;i<=L;i++){
scanf("%lf",hp+i);
// mih=min(mih,hp[i]);
// mxh=max(mxh,hp[i]);
}
while(P--){
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
//mit=min(mit,c);
// mxt=max(mxt,c);
}
double l=,r=;
// printf("%f %f\n",l,r);
double ans=;
double R;
while(r-l>=0.001){
R=(l+r)/;
if(Bellman(R))r=R;
else ans=R,l=R;
}
printf("%.2f\n",ans);
}
return ;
}

Sightseeing Cows(最优比率环)的更多相关文章

  1. POJ3621 Sightseeing Cows 最优比率环 二分法

    题目链接:http://poj.org/problem?id=3621 Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total ...

  2. POJ3621 Sightseeing Cows(最优比率环)

    题目链接:id=3621">http://poj.org/problem?id=3621 在一个有向图中选一个环,使得环上的点权和除以边权和最大.求这个比值. 经典的分数规划问题,我认 ...

  3. POJ 3621 Sightseeing Cows [最优比率环]

    感觉去年9月的自己好$naive$ http://www.cnblogs.com/candy99/p/5868948.html 现在不也是嘛 裸题,具体看学习笔记 二分答案之后判负环就行了 $dfs$ ...

  4. [转]01分数规划算法 ACM 二分 Dinkelbach 最优比率生成树 最优比率环

    01分数规划 前置技能 二分思想最短路算法一些数学脑细胞? 问题模型1 基本01分数规划问题 给定nn个二元组(valuei,costi)(valuei,costi),valueivaluei是选择此 ...

  5. poj 3621(最优比率环)

    题目链接:http://poj.org/problem?id=3621 思路:之前做过最小比率生成树,也是属于0/1整数划分问题,这次碰到这道最优比率环,很是熟悉,可惜精度没控制好,要不就是wa,要不 ...

  6. POJ 3621-Sightseeing Cows-最优比率环|SPFA+二分

    最优比率环问题.二分答案,对于每一个mid,把节点的happy值归类到边上. 对于每条边,用mid×weight减去happy值,如果不存在负环,说明还可以更大. /*---------------- ...

  7. 【poj3621】最优比率环

    题意: 给定n个点,每个点有一个开心度F[i],每个点有m条单向边,每条边有一个长度d,要求一个环,使得它的 开心度的和/长度和 这个比值最大.n<=1000,m<=5000 题解: 最优 ...

  8. POJ 3621 Sightseeing Cows (最优比率环 01分数划分)

    题意: 给定L个点, P条边的有向图, 每个点有一个价值, 但只在第一经过获得, 每条边有一个花费, 每次经过都要付出这个花费, 在图中找出一个环, 使得价值之和/花费之和 最大 分析: 这道题其实并 ...

  9. POJ 3621:Sightseeing Cows(最优比率环)

    http://poj.org/problem?id=3621 题意:有n个点m条有向边,每个点有一个点权val[i],边有边权w(i, j).找一个环使得Σ(val) / Σ(w)最大,并输出. 思路 ...

随机推荐

  1. Servlet基础知识(四)——Servlet过滤器Filter

    一.什么是过滤器: 政府大楼的安检保安,它既能对进入政府大楼的人员进行检查,只允许检查符合要求的进入:同时他也负责对出大楼的人进行检查,看他带出的东西是否符合要求. 同样的,Servlet中的过滤器既 ...

  2. hadoop hdfs 一些命令记录

    1.列出目录下的对象:hadoop fs -ls /lib 2.统计文件行数:hadoop fs -cat  /文件* | wc -l 3.统计文件或者目录大小:hadoop fs -count /l ...

  3. Mac 10.7.*安装XCode3.2.6的方法

    1.首先,在Xcode 3.2.6的磁盘映像(dmg文件)上点击右键,选择“磁盘工具”打开,如图1所示,转换成一个可读写的dmg文件,如图2所示. 图1 图2 转换好后双击它,让它在Finder里面显 ...

  4. 推荐一款手机端的图片滑动插件iSlider

    首先先放出中文官方地址   http://be-fe.github.io/iSlider/index.html 这是demo 众所周知,移动端的图片滑动插件有很多,为什么我要推荐这个iSlider呢? ...

  5. JS笔记 入门第三

    认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树) 把上面的代码进行分 ...

  6. 【原创】JPEG图像密写研究(二) 哈夫曼树的建立

    [原创]记录自己研究的过程,仅供参考,欢迎讨论... 在根据JPEG图像文件结构读取完文件后,提取出其中DHT段,利用其中内容建立哈夫曼树,便于之后译码工作.这里需要注意的是文件中的哈夫曼表数量不固定 ...

  7. java——%

    %; //结果为1 %; //结果为-1 ; //结果为1.2000000000000002

  8. WA(Write Amplification)写入放大

    WA是闪存及SSD相关的一个极为重要的属性.由于闪存必须先擦除才能再写入的特性,在执行这些操作时,数据都会被移动超过1次.这些重复的操作不单会增加写入的数据量,还会减少闪存的寿命,更吃光闪存的可用带宽 ...

  9. jquery $.ajax $.get $.post的区别

    $.ajax 是 jQuery 底层 AJAX 实现,$.ajax是一种通用的底层封装,$.ajax()请求数据之后,则需要使用回调函数,有beforeSend.error.dataFilter.su ...

  10. To the Max(矩阵压缩)

    To the Max Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 20000/10000K (Java/Other) Total Su ...