题目链接
题目大意:给你一个有向图,每个点都有一个权值,每条边都有一个长度,需要找到一个各点权值和/各边长度和 最大的环出来,输出这个比值。
分析:假设结点权值为wiw_iwi​,边的长度为lil_ili​设所求的比值r=∑i=1mwvi∗xi∑i=1mli∗xi(xi=0或1,1<i<m)r=\frac{\sum_{i=1}^{m}w_{vi}*x_i}{\sum_{i=1}^ml_i*x_i}(x_i=0或1,1<i<m)r=∑i=1m​li​∗xi​∑i=1m​wvi​∗xi​​(xi​=0或1,1<i<m)我们要最大化这个rrr假设这个最大值为ans
则满足以下式子ans>=∑i=1mwvi∗xi∑i=1mli∗xians>=\frac{\sum_{i=1}^{m}w_{vi}*x_i}{\sum_{i=1}^ml_i*x_i}ans>=∑i=1m​li​∗xi​∑i=1m​wvi​∗xi​​
移项可得∑i=1mwvi∗xi−ans∗∑i=1mli∗xi<=0\sum_{i=1}^{m}w_{vi}*x_i-ans*\sum_{i=1}^ml_i*x_i<=0∑i=1m​wvi​∗xi​−ans∗∑i=1m​li​∗xi​<=0
我们设f(ans)=∑i=1mwvi∗xi−ans∗∑i=1mli∗xif(ans)=\sum_{i=1}^{m}w_{vi}*x_i-ans*\sum_{i=1}^ml_i*x_if(ans)=∑i=1m​wvi​∗xi​−ans∗∑i=1m​li​∗xi​
f(ans)=∑i=1mdi∗xi,(di=wvi−ans∗li)f(ans)=\sum_{i=1}^md_i*x_i,(d_i=w_{vi}-ans*l_i)f(ans)=∑i=1m​di​∗xi​,(di​=wvi​−ans∗li​)
这个关于ans的函数是随ans变大而减小的,当f<=0时满足条件,当且仅当f=0时ans取得最大值,则我们就可以把每条边的权值设为did_idi​,然后二分ans,当用当前ans算出的f>0时则表明ans过小且不合法,当f<0时说明ans过大,而题目中要求的是一个环,当f<=0时是满足题意的,但我们不好判断,所以我们选择去判断f>0即图中存在正环。
判正环的算法可以用朴素的spfa也可dfs优化,最终的时间是朴素的是900+ms,而dfs优化则是30+ms
下面是dfs优化的

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#define MAIN main
#define PII pair<int,int>
#define x first
#define y second
using namespace std;
typedef long long ll;
const double eps=1e-8;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const int N=1e3+10,M=5e3+10;
struct edge
{int v,next,w;double d;
}e[M<<1];
int head[N],cnt;
void add(int u,int v,int w)
{e[++cnt].v=v;e[cnt].w=w;e[cnt].next=head[u];head[u]=cnt;
}
int w[N],n,m,vis[N],ok;
double dis[N];
void dfs(int u)
{if(ok) return;vis[u]=1;for(int i=head[u];i;i=e[i].next){int v=e[i].v;if(dis[v]<dis[u]+e[i].d){dis[v]=dis[u]+e[i].d;if(vis[v]){ok=1;return;}dfs(v);}}vis[u]=0;
}
bool judge(double mid)
{for(int i=1;i<=cnt;i++) e[i].d=w[e[i].v]*1.0-mid*(e[i].w*1.0);for(int i=1;i<=n;i++) vis[i]=0,dis[i]=0;ok=0;for(int i=1;i<=n;i++){if(!vis[i]) dfs(i);if(ok) return true;}return false;
}
int MAIN()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&w[i]);for(int i=1;i<=m;i++){int u,v,l;scanf("%d%d%d",&u,&v,&l);add(u,v,l);}double l=0,r=1e6,mid,ans;while(r-l>0.0001){mid=(l+r)/2;if(judge(mid)) l=mid;else ans=mid,r=mid;}printf("%.2f\n",ans);return 0;
}

POJ 3621 Sightseeing Cows(最优比率环+spfa的dfs判环优化)相关推荐

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

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

  2. poj 3621 Sightseeing Cows 01分数规划

    题目大意: http://poj.org/problem?id=3621 题解: 首先我们容易发现最优的路线一定只经过一个环. 所以我们可以把点权合并到边权上. 然后就转化为了一个01分数规划问题 求 ...

  3. POJ-3621 Sightseeing Cows 最优比率环、01分数规划

    题目链接:http://poj.org/problem?id=3621 这题是01分数规划问题,详细资料点这里.有了01分数规划的基础后,这个题目就很简单了.构建函数f(mid)=Σ(w[i]-mid ...

  4. POJ 3621 Sightseeing Cows

    SPFA+0/1分数规划. CODE: #include <iostream> #include <cstdlib> #include <cstdio> #incl ...

  5. hdu 3560(dfs判环)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3560 思路:dfs判环,这里成环的条件是环中的每个点的出度和入度都为1,因此dfs的时候只须判断的相连 ...

  6. Codeforces Round #836 (Div. 2) E.Tick, Tock(在线:带权并查集/离线:dfs判环)

    题目 n*m(1<=n,m<=2e5,n*m<=2e5)的网格图, 有一些格子内已经放入了闹钟,当前时刻在[0,h)(1<=h<=1e9)之间 还有一些位置没有放闹钟,输 ...

  7. [Noi2008]假面舞会(dfs判环)

    [Noi2008]假面舞会 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具 ...

  8. POJ 2728 Desert King [最优比率生成树]

    RT 我想哭 我想哭 我想哭 我想哭 我想哭 我想哭 我想哭 我想哭 我想哭 我想哭 我想哭 我想哭 凭什么!一模一样的代码一个TLE一个AC,改小二分范围和精度才过 凭什么! 我眼睁睁的看着那段代码 ...

  9. 紫书搜索 习题7-4 UVA - 818 Cutting Chains 暴力+dfs判环+位运算

    题目链接: https://vjudge.net/problem/UVA-818 题意: 选几个圆环去open.然后该圆环和其他就断开了.然后用这些open的圆环去连接剩下的圆环[最后打开的会合上], ...

最新文章

  1. 思科服务器查看生成树协议,CISCO中生成树协议的配置
  2. Java 垃圾回收机制概念梳理
  3. 无法查找网络工作组计算机,XP系统弹出“无法查看工作组计算机”提示怎么办?...
  4. flask的ajax的csrf代码
  5. java 类型转换 安全_JAVA 类型转换指令
  6. 无人承运平台系统流程图
  7. LeetCode 734. 句子相似性(哈希)
  8. Tensorflow取消占用全部GPU
  9. 基于链表的两个非递减有序序列的合并(C++)
  10. 小红书回应泄露未成年人隐私及审核漏放
  11. Rust 入坑指南 | CSDN 博文精选
  12. webStorm部分以及重要快捷键
  13. C语言基础函数(二)
  14. 配置linux的web服务
  15. OpenCV-图像处理(17、Sobel算子)
  16. VRay4.2 for 3dsMax2013-2020
  17. 华硕b365安装服务器系统,华硕b365主板装win10系统及bios设置教程(uefi+gpt)
  18. canvas画图及圆形的头像
  19. 笔记本电脑亮度调节按钮不起作用
  20. 《SysML精粹》学习记录--第九章

热门文章

  1. 史上最牛的Linux视频教程—兄弟连Linux笔记
  2. 【AIoT库】“星”未来,展宏“图”—— 2022 AIoT星图品牌线上发布会圆满落幕
  3. 阿里云服务器CentOS8安装Kafka
  4. QQ2010去除迷你首页O(∩_∩)O
  5. unity3D学习10 AR/MR技术
  6. 银联支付前端页面跳转
  7. oracle磁带的使用期限,存储的损耗 关于磁带寿命的一些探讨
  8. 快应用联盟展示入口合集(11月更新)
  9. linux解压工具软件,linux 安装rar解压工具
  10. 计算机入门模拟试卷c卷,《计算机入门》模拟卷C答案-华东师范大学.doc