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. hibernate sql查询后对象转换成实体类

    在多表查询的时候使用hibernate的sql查询的时候,一般返回的是object[]数组,或者可以使用  session.createSQLQuery(sql).setResultTransform ...

  2. webService接口大全

    中文<->英文双向翻译WEB服务 获得标准数据 Endpoint: http://fy.webxml.com.cn/webservices/EnglishChinese.asmx Disc ...

  3. USACO Section 5.1 Musical Themes(枚举)

    直接枚举O(n^3)会TLE,只要稍微加点优化,在不可能得到更优解时及时退出.其实就是道水题,虽说我提交了6次才过= =..我还太弱了 -------------------------------- ...

  4. Redis中各种方法的使用

    ①set ; i< ; i++) { // 不可以重复添加数据 client.AddItemToSet(KKey, "dong升-" + i); } client.Remov ...

  5. hdu 4455 Substrings(找规律&DP)

    Substrings Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  6. Android 开发之Matrix图片处理类的使用

    在Android中,对图片的处理需要使用到Matrix类,Matrix是一个3 x 3的矩阵,他对图片的处理分为四个基本类型: 1.Translate————平移变换 2.Scale————缩放变换 ...

  7. 类 BufferedReader

    以前学习的时候也没有太在意,在项目中使用到了才发现呵呵 1.读取一个txt文件,方法很多种我使用了字符流来读取(为了方便) FileReader fr = new FileReader("f ...

  8. H3C交换配置PBR最佳实践

    简要说明 PBR算是比较常用的功能,需要我们去掌握一下 配置步骤简要 配置BFD 配置track 配置acl 配置policy-based-route 在接口上面应用policy-based-rout ...

  9. sql发邮件

    DROP PROCEDURE USP_CheckProductCodeRepeatAndSendMail go ---检查商家是否有重复的商品编号,如果有则发送给系统配置中接收的用户邮箱 CREATE ...

  10. linux下如何查看系统和内核版本

        1. 查看内核版本命令: 1) [root@q1test01 ~]# cat /proc/version Linux version 2.6.9-22.ELsmp (bhcompile@cro ...