POJ3621:Sightseeing Cows——题解
http://poj.org/problem?id=3621
全文翻译参自洛谷:https://www.luogu.org/problemnew/show/P2868
题目大意:一个有向图,每个点都有一个价值,每条路通过需要一定时间,求出一个回路使得价值和/时间和最大。(重复经过一个点不会额外增加价值)
按照01分数规划的套路,我们显然可以将路的边权更改为时间*枚举的答案-目的地价值,然后找一个环。
如果这个环是一个负环,那么显然答案还可以变得更大,反之则需要变小。
所以我们需要用spfa判断图中的负环。但是bfs-spfa显然太慢,所以我们需要更高效的算法——dfs-spfa,需要优化的地方。
1.由于我们的目的不是为了求最短路,所以大可以不必将dis全部清成inf(其实连清空都不需要,可以感性理解)。
2.dfs-spfa的好处在于一直搜,直到搜到我们找到的点已经被找过为止。
3.剩下的就是spfa的基本操作了——当dis被更新的时候才能走这个点。
(double和int傻傻搞不清楚……)
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#include<cctype>
#include<algorithm>
using namespace std;
typedef double dl;
const dl eps=1e-;
const int INF=;
const int M=;
const int N=;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct node{
int to,nxt,l;
}e[M];
int head[N],f[N],cnt,n,m;
bool vis[N];
dl dis[N],w[M];
inline void add(int u,int v,int l){
cnt++;
e[cnt].to=v;
e[cnt].l=l;
e[cnt].nxt=head[u];
head[u]=cnt;
return;
}
bool spfa(int u){
vis[u]=;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(dis[v]>dis[u]+w[i]){
dis[v]=dis[u]+w[i];
if(vis[v]||spfa(v)){
vis[v]=;
return ;
}
}
}
vis[u]=;
return ;
}
bool pan(){
for(int i=;i<=n;i++){
if(spfa(i))return ;
}
return ;
}
int main(){
n=read();m=read();
for(int i=;i<=n;i++)f[i]=read();
for(int i=;i<=m;i++){
int u=read(),v=read(),l=read();
add(u,v,l);
}
dl l=,r=;
while(r-l>eps){
dl mid=(l+r)/;
for(int i=;i<=cnt;i++){
int v=e[i].to;
w[i]=(dl)mid*e[i].l-f[v];
}
if(pan())l=mid;
else r=mid;
}
printf("%.2f\n",l);
return ;
}
POJ3621:Sightseeing Cows——题解的更多相关文章
- POJ3621 Sightseeing Cows 最优比率环 二分法
题目链接:http://poj.org/problem?id=3621 Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total ...
- POJ3621 Sightseeing Cows(最优比率环)
题目链接:id=3621">http://poj.org/problem?id=3621 在一个有向图中选一个环,使得环上的点权和除以边权和最大.求这个比值. 经典的分数规划问题,我认 ...
- poj3621 Sightseeing Cows --- 01分数规划
典型的求最优比例环问题 參考资料: http://blog.csdn.net/hhaile/article/details/8883652 此题中,给出每一个点和每条边的权值,求一个环使 ans=∑点 ...
- POJ3621 Sightseeing Cows【最短路】
题目大意:在一个无向图里找一个环,是的点权和除以边权和最大 思路:UVA11090姊妹题 事实上当这题点权和都为1时就是上一题TUT #include <stdio.h> #include ...
- poj3621 Sightseeing Cows
01分数规划 二分+spfa负环(SLF优化) #include<cstdio> #include<iostream> #include<cstring> #inc ...
- 洛谷 P2868 [USACO07DEC]观光奶牛Sightseeing Cows 题解
题面 这道题是一道标准的01分数规划: 但是有一些细节可以优化: 不难想到要二分一个mid然后判定图上是否存在一个环S,该环是否满足∑i=1t(Fun[vi]−mid∗Tim[ei])>0 但是 ...
- 【POJ3621】Sightseeing Cows 分数规划
[POJ3621]Sightseeing Cows 题意:在给定的一个图上寻找一个环路,使得总欢乐值(经过的点权值之和)/ 总时间(经过的边权值之和)最大. 题解:显然是分数规划,二分答案ans,将每 ...
- 【POJ3621】【洛谷2868】Sightseeing Cows(分数规划)
[POJ3621][洛谷2868]Sightseeing Cows(分数规划) 题面 Vjudge 洛谷 大意: 在有向图图中选出一个环,使得这个环的点权\(/\)边权最大 题解 分数规划 二分答案之 ...
- 【POJ3621】Sightseeing Cows
Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8331 Accepted: 2791 ...
随机推荐
- Unbuntu安装RVM
apt-get install curl #安装rvm curl -L https://get.rvm.io | bash #执行启动 source /home/mafei/.rvm/scripts/ ...
- android学习十一 高级调试分析功能
1.debug 功能列表 2.ddms功能( 内存检查,线程检查,视图层次分析) 3.跟踪代码 TraceView 4.命令行工具 adb 5.策略检查StrictMode
- selenium--driver.switchTo()
在自动化测试中,会遇到多窗口.多iframe.多alert的情况.此时,会使用driver.switchTo()来解决. 下面时关于driver.switchTo()的详细介绍: 1.多windows ...
- Selenium自动化测试第一天(上)
如有任何学习问题,可以添加作者微信:lockingfree 目录 Selenium自动化测试基础 Selenium自动化测试第一天(上) Selenium自动化测试第一天(下) Selenium自动化 ...
- Selenium 入门到精通系列:一
Selenium 入门到精通系列 PS:控制浏览器窗口大小.前进.后退.刷新 例子 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 20 ...
- Eclipse上安装Activiti插件
今天我们来讲下如何在Eclipse上安装Activiti插件,以后我们要用这个插件来画流程设计图: 这个插件名字是:Activiti BPMN 2.0 designer 具体使用,可以参考官方用户指南 ...
- Redis命令续
Redis 集合命令 下表列出了 Redis 集合基本命令: 序号 命令及描述 1 SADD key member1 [member2] 向集合添加一个或多个成员 2 SCARD key 获取集合的 ...
- 【Linux 运维】linux系统关机、重启、注销命令
linux 关机.重启.注销命令: 关机命令: shutdown -h now 立刻关机(生产常用) shutdown -h +1 一分钟后关机 ( shutdown -c 可以将 ...
- php多进程单例模式下的 MySQL及Redis连接错误修复
前几天写了个php常驻脚本,主要逻辑如下 //跑完数据后休息60秒 $sleepTime = 60; $maxWorker = 10; while (true) { $htmlModel = new ...
- 统计学习三:2.K近邻法代码实现(以最近邻法为例)
通过上文可知k近邻算法的基本原理,以及算法的具体流程,kd树的生成和搜索算法原理.本文实现了kd树的生成和搜索算法,通过对算法的具体实现,我们可以对算法原理有进一步的了解.具体代码可以在我的githu ...