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了。如果有负环的话,说明可以得到更优的结果。
还有起点是不固定的,于是一开始先把所有的点入队,然后再去求。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
#define N 10010
#define INF 0x3f3f3f3f
const double eps = 1e-;
struct Edge {
int v, w, nxt;
} edge[N];
int n, m, val[N], vis[N], tid[N], head[N], tot;
double dis[N]; void Add(int u, int v, int w) { edge[tot] = (Edge) {v, w, head[u]}; head[u] = tot++; } bool SPFA(double k) {
queue<int> que;
memset(tid, , sizeof(tid));
for(int i = ; i <= n; i++) que.push(i), vis[i] = , dis[i] = , tid[i] = ;
while(!que.empty()) {
int u = que.front(); que.pop();
tid[u]++; vis[u] = ;
if(tid[u] > n) return false;
for(int i = head[u]; ~i; i = edge[i].nxt) {
int v = edge[i].v;
double d = (double)val[v] - k * edge[i].w;
if(dis[v] > dis[u] - d) {
dis[v] = dis[u] - d;
if(!vis[v]) vis[v] = , que.push(v);
}
}
}
return true;
} double solve() {
double l = , r = INF;
while(fabs(r - l) > eps) {
double mid = (l + r) / ;
if(SPFA(mid)) r = mid;
else l = mid;
}
return l;
} int main() {
while(~scanf("%d%d", &n, &m)) {
tot = ; memset(head, -, sizeof(head));
for(int i = ; i <= n; i++) scanf("%d", &val[i]);
for(int i = ; i < m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
Add(u, v, w);
}
printf("%.2f\n", solve());
}
return ;
}
POJ 3621:Sightseeing Cows(最优比率环)的更多相关文章
- POJ 3621 Sightseeing Cows [最优比率环]
感觉去年9月的自己好$naive$ http://www.cnblogs.com/candy99/p/5868948.html 现在不也是嘛 裸题,具体看学习笔记 二分答案之后判负环就行了 $dfs$ ...
- 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 在一个有向图中选一个环,使得环上的点权和除以边权和最大.求这个比值. 经典的分数规划问题,我认 ...
- POJ 3621 Sightseeing Cows 【01分数规划+spfa判正环】
题目链接:http://poj.org/problem?id=3621 Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total ...
- [POJ 3621] Sightseeing Cows
[题目链接] http://poj.org/problem?id=3621 [算法] 01分数规划(最优比率环) [代码] #include <algorithm> #include &l ...
- POJ 3621 Sightseeing Cows (最优比率环 01分数划分)
题意: 给定L个点, P条边的有向图, 每个点有一个价值, 但只在第一经过获得, 每条边有一个花费, 每次经过都要付出这个花费, 在图中找出一个环, 使得价值之和/花费之和 最大 分析: 这道题其实并 ...
- POJ 3621 Sightseeing Cows(最优比例环+SPFA检测)
Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10306 Accepted: 3519 ...
- POJ 3621 Sightseeing Cows 01分数规划,最优比例环的问题
http://www.cnblogs.com/wally/p/3228171.html 题解请戳上面 然后对于01规划的总结 1:对于一个表,求最优比例 这种就是每个点位有benefit和cost,这 ...
- POJ 3621 Sightseeing Cows | 01分数规划
题目: http://poj.org/problem?id=3621 题解: 二分答案,检查有没有负环 #include<cstdio> #include<algorithm> ...
- POJ 3621 Sightseeing Cows (bellman-Ford + 01分数规划)
题意:给出 n 个点 m 条有向边,要求选出一个环,使得这上面 点权和/边权和 最大. 析:同样转成是01分数规划的形式,F / L 要这个值最大,也就是 G(r) = F - L * r 这个值为0 ...
随机推荐
- Qt移动应用开发(六):QML与C++互动
Qt移动应用开发(六):QML与C++互动 上一篇文章讲到了在Qt Quick中实现场景切换的一种可能的方法,场景切换是诸如游戏等应用在内必需要面临的技术难点,所以场景切换并没有通行的方法,依据自己的 ...
- Fedora15下搭建QT开发环境及编译QT(提前一键安装完,qt编译所有必需库 yum install gcc-c++ libXtst-devel freetype freetype-devel fontconfig-devel libXrender-devel )
看了不少linux上编译qt的文章,实际上直接通过yum 安装qt是最方便的,请参考<yum安装qt> 不过初步接触fedora,为了了解一下如何在linux上编译.安装开源代码,所以必须 ...
- crawler_正则表达式零宽断言
在使用正则表达式时,有时我们需要捕获的内容前后必须是特定内容,但又不捕获这些特定内容的时候,零宽断言就起到作用了. (?=exp):零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp. ...
- 经典c开源项目
1. Webbench Webbench是一个在Linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连 ...
- IIS基本介绍
应用程序池-网站-应用程序 1 应用程序池 设置应用程序的各种设置,新建.修改应用程序的时候可以选择应用程序池 2 [站外图片上传中...(image-3924c8-1511163001873 ...
- 批量删除C和C++注释
使用Python语言 ,实现批量删除C/C++类型注释1.目前支持去掉.h .hpp .c .cpp .java 这些以//或/**/为注释符的源文件 2.支持递归遍历目录 3.当前版本为Python ...
- Qt打开外部程序和文件夹需要注意的细节(注意QProcess的空格问题,以及打开本地文件时,需要QUrl::fromLocalFile才可以)
下午写程序中遇到几个小细节,需要在这里记录一下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 QProcess *process = new QProcess(this ...
- 一个技术人,最重要的是:极客精神(好奇心 + 探索欲)(新de代码)
一个技术人,最重要的是:极客精神(好奇心 + 探索欲) 初到社会,面对众多的IT企业,我们是陌生与好奇的,认为所有企业都是管理一流并且高大上等的.然而工作多年以后你会发现,国内的IT企业环境良莠不齐, ...
- Android零基础入门第12节:熟悉Android Studio界面,开始装逼卖萌
原文:Android零基础入门第12节:熟悉Android Studio界面,开始装逼卖萌 通过前两期的学习,我们可以正确搭建好Android Studio的开发环境,也创建了HelloWorld工程 ...
- ASP.NET MVC控制器Controller
控制器的定义 MVC模式下的控制器(Controller)主要负责响应用户的输入,并且在响应时可能的修改模型(Model). 之前的URL访问,通常是通过指定服务器的路径来实现,如访问URL:http ...