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(最优比率环)相关推荐

  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分数规划问题,详细资料点这里.有了01分数规划的基础后,这个题目就很简单了.构建函数f(mid)=Σ(w[i]-mid ...

  3. POJ 3621 Sightseeing Cows(最优比率环+spfa的dfs判环优化)

    题目链接 题目大意:给你一个有向图,每个点都有一个权值,每条边都有一个长度,需要找到一个各点权值和/各边长度和 最大的环出来,输出这个比值. 分析:假设结点权值为wiw_iwi​,边的长度为lil_i ...

  4. poj 3621 Sightseeing Cows 01分数规划

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

  5. POJ 3621 Sightseeing Cows

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

  6. 转载二分 01 分数规划即最大化平均值的证明0/1分数规划、最优比率生成树、最优比率环

    首页 新随笔 联系 管理 订阅 随笔- 20  文章- 0  评论- 9 [Algorithm]01分数规划--Update:2012年7月27日 [关键字] 0/1分数规划.最优比率生成树.最优比率 ...

  7. 解题报告:luoguP2868 Sightseeing Cows G(最优比率环,负环判定,二分答案)

    根据题意,我们要环上各点权值之和除以各边权值之和最大. 求最大答案,很明显可以使用二分答案.那么我们假设当前答案为 x,如果有更大的答案,那么方程就可以按下图转换: 也就是说如果有更大的答案,则有一个 ...

  8. bzoj 1690: [Usaco2007 Dec]奶牛的旅行(01分数规划--最优比率环)

    01分数规划问题: 给你n个物品,a[i]表示第i个物品的收益,b[i]表示代价,x[i]表示选或不选,求一个最佳方案使得下式取值最大 通用解: 当然是从式子上考虑,定义函数F[cnt]如下: 其中c ...

  9. 【bzoj1690/Usaco2007 Dec】奶牛的旅行——分数规划 最优比率环

    Description 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的城 ...

最新文章

  1. 气计算,人工智能高度发达的未来世界
  2. python连接clickhouse
  3. 不懂指针类型,7个例子给你讲明白
  4. win下python2,3和pip2,3双版本共存
  5. TableLayoutPanel闪烁问题解决
  6. 阿里终面:为什么应用刚启动的时候比较卡,过一会就好了?
  7. GridView 批量删除,自定义分页,定位页码
  8. The Economist经济学人是如何使用Go语言构建内容平台微服务架构的?
  9. oracle XDB和XPT
  10. ios 7.1企业证书无线安装
  11. java4选择结构 二
  12. 锐捷交换机配置保存到计算机,锐捷交换机备份配置文件的操作方法
  13. 昆仑通泰历史数据导出到u盘_昆仑通态(mcgsTpc)触摸屏 U盘功能包下载步骤
  14. EasyRecovery2022版支持电脑, 硬盘, U盘, 内存卡, 回收站等设备数据恢复
  15. 面向 5G 的新型多载波传输技术比较
  16. python将PDF文件转化为图片
  17. ts/js 函数传参带函数写法
  18. 【XJTUSE计算机图形学】第四章 真实感图形学(2)——简单光照明模型
  19. 计算机中桌面位置更改,电脑默认桌面文件夹位置修改不了怎么办
  20. 【数据安全 每周资讯】欧盟数字新法案即将出台,给美科技巨头再施“紧箍咒”

热门文章

  1. 询问区间内出现次数最多的数出现的次数
  2. jquery选择器之基本选择器
  3. jsp input输入实时校验长度并提示_HotCRC未公开发布的高版本穷举输入规则(V3.02)...
  4. 计算机网络—物理层的传输介质以及物理层设备
  5. bzoj 2427: [HAOI2010]软件安装(Trajan+树形DP)
  6. 2017CCPC哈尔滨赛区总结
  7. python数据存储系列教程——python中redis数据库操作:连接、增删查改、多级路径
  8. 动态ip解析 linux,ddwrt路由/linux动态解析ip(ddns)到dnspod配置
  9. Servlet CDI Example Analysis
  10. TCP TIME_WAIT详解