POJ 3621:Sightseeing Cows(最优比率环)
http://poj.org/problem?id=3621
题意:有n个点m条有向边,每个点有一个点权val[i],边有边权w(i, j)。找一个环使得Σ(val) / Σ(w)最大,并输出。
思路:和之前的最优比率生成树类似,还是构造成这样的式子:F(L) = Σ(val[i] * x[i]) - Σ(w[i] * x[i] * L) = Σ(d[i]) * x[i] (d[i] = val[i] - w[i] * L),要使得L越大越好。
那么当L越大的时候,F(L)就越小,如果F(L)大于等于0的话,说明是可以改进的,于是要找最大的d[i],使得结果更优。这样就是求最长路并判正环。但是并不好处理。
那么反过来,F(L) = Σ(-d[i] * x[i]),就是要求得最短路并判负环,这样就可以直接套SPFA了。如果有负环的话,说明可以得到更优的结果。
还有起点是不固定的,于是一开始先把所有的点入队,然后再去求。
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 #include <queue> 6 using namespace std; 7 #define N 10010 8 #define INF 0x3f3f3f3f 9 const double eps = 1e-9; 10 struct Edge { 11 int v, w, nxt; 12 } edge[N]; 13 int n, m, val[N], vis[N], tid[N], head[N], tot; 14 double dis[N]; 15 16 void Add(int u, int v, int w) { edge[tot] = (Edge) {v, w, head[u]}; head[u] = tot++; } 17 18 bool SPFA(double k) { 19 queue<int> que; 20 memset(tid, 0, sizeof(tid)); 21 for(int i = 1; i <= n; i++) que.push(i), vis[i] = 1, dis[i] = 0, tid[i] = 1; 22 while(!que.empty()) { 23 int u = que.front(); que.pop(); 24 tid[u]++; vis[u] = 0; 25 if(tid[u] > n) return false; 26 for(int i = head[u]; ~i; i = edge[i].nxt) { 27 int v = edge[i].v; 28 double d = (double)val[v] - k * edge[i].w; 29 if(dis[v] > dis[u] - d) { 30 dis[v] = dis[u] - d; 31 if(!vis[v]) vis[v] = 1, que.push(v); 32 } 33 } 34 } 35 return true; 36 } 37 38 double solve() { 39 double l = 0, r = INF; 40 while(fabs(r - l) > eps) { 41 double mid = (l + r) / 2; 42 if(SPFA(mid)) r = mid; 43 else l = mid; 44 } 45 return l; 46 } 47 48 int main() { 49 while(~scanf("%d%d", &n, &m)) { 50 tot = 0; memset(head, -1, sizeof(head)); 51 for(int i = 1; i <= n; i++) scanf("%d", &val[i]); 52 for(int i = 0; i < m; i++) { 53 int u, v, w; 54 scanf("%d%d%d", &u, &v, &w); 55 Add(u, v, w); 56 } 57 printf("%.2f\n", solve()); 58 } 59 return 0; 60 }
转载于:https://www.cnblogs.com/fightfordream/p/6428687.html
POJ 3621:Sightseeing Cows(最优比率环)相关推荐
- POJ 3621 Sightseeing Cows [最优比率环]
感觉去年9月的自己好$naive$ http://www.cnblogs.com/candy99/p/5868948.html 现在不也是嘛 裸题,具体看学习笔记 二分答案之后判负环就行了 $dfs$ ...
- POJ-3621 Sightseeing Cows 最优比率环、01分数规划
题目链接:http://poj.org/problem?id=3621 这题是01分数规划问题,详细资料点这里.有了01分数规划的基础后,这个题目就很简单了.构建函数f(mid)=Σ(w[i]-mid ...
- POJ 3621 Sightseeing Cows(最优比率环+spfa的dfs判环优化)
题目链接 题目大意:给你一个有向图,每个点都有一个权值,每条边都有一个长度,需要找到一个各点权值和/各边长度和 最大的环出来,输出这个比值. 分析:假设结点权值为wiw_iwi,边的长度为lil_i ...
- poj 3621 Sightseeing Cows 01分数规划
题目大意: http://poj.org/problem?id=3621 题解: 首先我们容易发现最优的路线一定只经过一个环. 所以我们可以把点权合并到边权上. 然后就转化为了一个01分数规划问题 求 ...
- POJ 3621 Sightseeing Cows
SPFA+0/1分数规划. CODE: #include <iostream> #include <cstdlib> #include <cstdio> #incl ...
- 转载二分 01 分数规划即最大化平均值的证明0/1分数规划、最优比率生成树、最优比率环
首页 新随笔 联系 管理 订阅 随笔- 20 文章- 0 评论- 9 [Algorithm]01分数规划--Update:2012年7月27日 [关键字] 0/1分数规划.最优比率生成树.最优比率 ...
- 解题报告:luoguP2868 Sightseeing Cows G(最优比率环,负环判定,二分答案)
根据题意,我们要环上各点权值之和除以各边权值之和最大. 求最大答案,很明显可以使用二分答案.那么我们假设当前答案为 x,如果有更大的答案,那么方程就可以按下图转换: 也就是说如果有更大的答案,则有一个 ...
- bzoj 1690: [Usaco2007 Dec]奶牛的旅行(01分数规划--最优比率环)
01分数规划问题: 给你n个物品,a[i]表示第i个物品的收益,b[i]表示代价,x[i]表示选或不选,求一个最佳方案使得下式取值最大 通用解: 当然是从式子上考虑,定义函数F[cnt]如下: 其中c ...
- 【bzoj1690/Usaco2007 Dec】奶牛的旅行——分数规划 最优比率环
Description 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的城 ...
最新文章
- 气计算,人工智能高度发达的未来世界
- python连接clickhouse
- 不懂指针类型,7个例子给你讲明白
- win下python2,3和pip2,3双版本共存
- TableLayoutPanel闪烁问题解决
- 阿里终面:为什么应用刚启动的时候比较卡,过一会就好了?
- GridView 批量删除,自定义分页,定位页码
- The Economist经济学人是如何使用Go语言构建内容平台微服务架构的?
- oracle XDB和XPT
- ios 7.1企业证书无线安装
- java4选择结构 二
- 锐捷交换机配置保存到计算机,锐捷交换机备份配置文件的操作方法
- 昆仑通泰历史数据导出到u盘_昆仑通态(mcgsTpc)触摸屏 U盘功能包下载步骤
- EasyRecovery2022版支持电脑, 硬盘, U盘, 内存卡, 回收站等设备数据恢复
- 面向 5G 的新型多载波传输技术比较
- python将PDF文件转化为图片
- ts/js 函数传参带函数写法
- 【XJTUSE计算机图形学】第四章 真实感图形学(2)——简单光照明模型
- 计算机中桌面位置更改,电脑默认桌面文件夹位置修改不了怎么办
- 【数据安全 每周资讯】欧盟数字新法案即将出台,给美科技巨头再施“紧箍咒”
热门文章
- 询问区间内出现次数最多的数出现的次数
- jquery选择器之基本选择器
- jsp input输入实时校验长度并提示_HotCRC未公开发布的高版本穷举输入规则(V3.02)...
- 计算机网络—物理层的传输介质以及物理层设备
- bzoj 2427: [HAOI2010]软件安装(Trajan+树形DP)
- 2017CCPC哈尔滨赛区总结
- python数据存储系列教程——python中redis数据库操作:连接、增删查改、多级路径
- 动态ip解析 linux,ddwrt路由/linux动态解析ip(ddns)到dnspod配置
- Servlet CDI Example Analysis
- TCP TIME_WAIT详解