POJ3621Sightseeing Cows[01分数规划 spfa(dfs)负环 ]

Sightseeing Cows
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 9703 Accepted: 3299

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

Source


转载一段题解:
http://www.cnblogs.com/wally/p/3228171.html
题目的意思是:求一个环的{点权和}除以{边权和},使得那个环在所有环中{点权和}除以{边权和}最大。 令在一个环里,点权为v[i],对应的边权为e[i], 即要求:∑(i
=1,n)v[i]/∑(i=1,n)e[i]最大的环(n为环的点数), 设题目答案为ans, 即对于所有的环都有 ∑(i=1,n)(v[i])/∑(i=1,n)(e[i])<=ans 变形得ans* ∑(i=1,n)(e[i])>=∑(i=1,n)(v[i]) 再得 ∑(i=1,n)(ans*e[i]-v[i]) >=0 稍分析一下,就有: 当k<ans时,就存在至少一个环∑(i=1,n)(k*e[i]-v[i])<0,即有负权回路(边权为k*e[i]-v[i]); 当k>=ans时,就对于所有的环∑(i=1,n)(k*e[i]-v[i])>=0,即没有负权回路。 然后我们就可以使新的边权为k*e[i]-v[i],用spfa来判断付权回路,二分ans。

再一段

http://www.cnblogs.com/proverbs/archive/2013/01/09/2853741.html

01分数规划,简单构造,将点权转移到边权上~因为一个环上的点和边的数量是相等的~

设i,j之间初始边权为w[i][j],修改后的边权为g[i][j],则g[i][j]=w[i][j]*mid+val[i]

spfa判负环即可~

 

列式转换一下,所有的都满足

 ∑(i=1,n)(ans*e[i]-v[i]) >=0
如果有的不满足,就更改ans使他满足,用实数二分的方法

用spfa判负环,有负环就说明可以选出一个n的集合使上述条件不满足
因为不需要最短路所以把初始化所有点加进去d=0
还有一种很神的dfs写法,负环超级快;从每个点dfs-spfa看看有没有回到自己

bfs:
//
//  main.cpp
//  poj3621
//
//  Created by Candy on 9/13/16.
//  Copyright ? 2016 Candy. All rights reserved.
//

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
const int N=1005,M=5005;

int n,m,a,b;
double l,r,mid,f[N],c;
struct edge{
    int v,ne;
    double w;
}e[M];
int h[N],cnt=0;
inline void ins(int u,int v,double w){
    cnt++;
    e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;
}

int inq[N],num[N];
double d[N];
bool spfanc(double p){
    queue<int> q;
    memset(num,0,sizeof(num));
    for(int i=1;i<=n;i++) {d[i]=0;inq[i]=1;q.push(i);num[i]++;}
    
    while(!q.empty()){
        int u=q.front();q.pop();inq[u]=0;
        for(int i=h[u];i;i=e[i].ne){
            int v=e[i].v; double w=e[i].w*p-f[u];
            if(d[v]>d[u]+w){
                d[v]=d[u]+w;
                if(!inq[v]){q.push(v);inq[v]=1;if(++num[v]>n) return true;}
            }
        }
    }
    return false;
}
int main(int argc, const char * argv[]) {
    while(cin>>n>>m){
        cnt=0;
        memset(h,0,sizeof(h));
        for(int i=1;i<=n;i++) scanf("%lf",&f[i]);
    for(int i=1;i<=m;i++){scanf("%d%d%lf",&a,&b,&c);ins(a,b,c);}
    
    l=0,r=2000;
    while(r-l>1e-4){
        mid=(l+r)/2;//printf("%.2f\n",mid);
        if(spfanc(mid)) l=mid;
        else r=mid;
    }
    printf("%.2f\n",mid);
    }
    return 0;
}
 
  

 dfs:

//
//  main.cpp
//  poj3621
//
//  Created by Candy on 9/13/16.
//  Copyright ? 2016 Candy. All rights reserved.
//

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
const int N=1005,M=5005;

int n,m,a,b;
double l,r,mid,f[N],c;
struct edge{
    int v,ne;
    double w;
}e[M];
int h[N],cnt=0;
inline void ins(int u,int v,double w){
    cnt++;
    e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;
}

int vis[N],st;
double d[N];
inline bool dfs(int u,double p){
    vis[u]=st;
    for(int i=h[u];i;i=e[i].ne){
        int v=e[i].v; double w=e[i].w*p-f[u];
        if(d[v]>d[u]+w){
            d[v]=d[u]+w;
            if(vis[v]==vis[u]) return true;
            else if(dfs(v,p)) return true;
        }
    }
    vis[u]=0;
    return false;
}
bool nc(double p){
    memset(vis,0,sizeof(vis));
    //memset(d,0,sizeof(d));
    for(st=1;st<=n;st++)
        if(dfs(st,p)) return true;
    
    return false;
}
int main(int argc, const char * argv[]) {
    while(cin>>n>>m){
        cnt=0;
        memset(h,0,sizeof(h));
        for(int i=1;i<=n;i++) scanf("%lf",&f[i]);
        for(int i=1;i<=m;i++){scanf("%d%d%lf",&a,&b,&c);ins(a,b,c);}
        
        l=0,r=1000;
        while(r-l>1e-4){
            mid=(l+r)/2;//printf("%.2f\n",mid);
            if(nc(mid)) l=mid;
            else r=mid;
        }
        printf("%.2f\n",mid);
    }
    return 0;
}

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
大学生在线租房平台管理系统按照操作主体分为管理员和用户。管理员的功能包括报修管理、报修评价管理、字典管理、房东管理、房屋管理、房屋收藏管理、房屋留言管理、房屋租赁管理、租房论坛管理、公告信息管理、留言板管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 大学生在线租房平台管理系统可以提高大学生在线租房平台信息管理问题的解决效率,优化大学生在线租房平台信息处理流程,保证大学生在线租房平台信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理大学生在线租房平台信息,包括房屋管理,培训管理,报修管理,薪资管理等,可以管理公告。 房屋管理界面,管理员在房屋管理界面中可以对界面中显示,可以对房屋信息的房屋状态进行查看,可以添加新的房屋信息等。报修管理界面,管理员在报修管理界面中查看报修种类信息,报修描述信息,新增报修信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值