根据题意,我们要环上各点权值之和除以各边权值之和最大。

求最大答案,很明显可以使用二分答案。那么我们假设当前答案为 x,如果有更大的答案,那么方程就可以按下图转换:

也就是说如果有更大的答案,则有一个环是负环(环边权总和为负数)。也就是说我们把求最大答案的问题转换为了判断当前建的图中是否存在负环。
我们可以将每一条边的边权设为

然后使用 spfaspfaspfa 判断是否有负环。
使用spfa判断是否有负环,我们只需要用一个cnt数组存储每一个点的从起点到该点的最短路径包含的边数,在每次更新dis[y]的时候,判断cnt[y]=cnt[x]+1)>ncnt[y] = cnt[x] + 1 ) > ncnt[y]=cnt[x]+1)>n,若大于n则存在负环。这是一种效率较高的判断负环的方法。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<map>using namespace std;const int N = 1e4+7;
const int M = 5e4+7;
const double eps = 1e-6;
int f[N];
int head[N],ver[M],nex[M],tot;
double edge[M];
int n,m;
int a[N];
double dis[N];
bool vis[N];//判断是否在队列里
int cnt[N];//表示的是从起点到x的最短路径包含的边数void add(int x,int y,double z){ver[++tot] = y;nex[tot] = head[x];edge[tot] = z;head[x] = tot;
}
//判断是否存在负环,cnt[i]大于n则有负环(一共n个点,如果没有负环就最多等于n)
bool spfa(){queue<int>q;//没有起点,每个人都是起点for(int i = 1;i <= n;++i){q.push(i);dis[i] = 0;vis[i] = 1;}memset(cnt,0,sizeof cnt);while(q.size()){int x = q.front();q.pop();vis[x] = 0;for(int i = head[x];i;i = nex[i]){int y = ver[i];if(dis[y] > dis[x] + edge[i]){dis[y] = dis[x] + edge[i];if((cnt[y] = cnt[x] + 1 ) > n)return 1;if(!vis[y]){q.push(y);vis[y] = 1;}}}}return 0;
}
int x[N],y[N], z[N];bool check(double w){tot = 0;memset(head,0,sizeof head);for(int i = 1;i <= m;++i)add(x[i],y[i],w * z[i] - f[x[i]]);//减去出点权值return spfa();
}int main(){cin>>n>>m;for(int i = 1;i <= n;++i)scanf("%d",&f[i]);for(int i = 1;i <= m;++i)scanf("%d %d %d",&x[i],&y[i],&z[i]);double l = 0,r = 1000;while(r - l > eps){double mid = (l + r) / 2;if(check(mid))l = mid;else r = mid;}printf("%.2f",l);return 0;
}

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

  1. POJ 3621:Sightseeing Cows(最优比率环)

    http://poj.org/problem?id=3621 题意:有n个点m条有向边,每个点有一个点权val[i],边有边权w(i, j).找一个环使得Σ(val) / Σ(w)最大,并输出. 思路 ...

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

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

  3. 解题报告:【kuangbin带你飞】专题四 最短路练习题

    目录 A. POJ - 2387 TiltheCowsComeHomeTil\ the\ Cows\ Come\ HomeTil the Cows Come Home--------(最短路模板题)[ ...

  4. Codeforces Round #693 (Div. 3)A~G解题报告

    Codeforces Round #693 (Div. 3)A~G解题报告 A Cards for Friends 原题信息 http://codeforces.com/contest/1472/pr ...

  5. 树状数组c语言模板,【树状数组】Cows (POJ2481) PASCAL 解题报告

    [树状数组]Cows (POJ2481) Time Limit:1000MS Memory Limit:65536K Total Submit:16 Accepted:8 Description [问 ...

  6. Codeforces Round #697 (Div. 3)A~G解题报告

    Codeforces Round #697 (Div. 3)A~G解题报告 题 A Odd Divisor 题目介绍 解题思路 乍一想本题,感觉有点迷迷糊糊,但是证难则反,直接考虑没有奇数因子的情况, ...

  7. 解题报告:【kuangbin带你飞】专题九 连通图

    目录 A.POJ 1236 Network of Schools(有向图缩点) B.UVA 315 Network(找割点) C.UVA 796 Critical Links(桥) D.POJ 369 ...

  8. 2021-09-07 停课集训R8解题报告

    停课集训R8解题报告 小萌新到第5天才有空写题解,心都碎了 哼,哼,啊啊啊啊啊啊啊啊啊啊啊啊! R8:DP初级1 实话说,以前DP是我最讨厌的类型. 今天只A了2道题.可以说是十分痛苦 T1 问题 A ...

  9. 解题报告 (十三) 尺取法

    文章目录 尺取法 解题报告 PKU 2100 Graveyard Design PKU 3061 Subsequence PKU 2739 Sum of Consecutive Prime Numbe ...

最新文章

  1. python3x 中如何使用tkMessageBox
  2. 如何用javascript控制上传文件的大小
  3. 自己动手实现自旋锁(spinlock)
  4. WCF入门到精通(二)——契约
  5. 【prim】【最小生成树】最优布线问题(ssl 1612)
  6. 你必须搞清楚的String,StringBuilder,StringBuffer
  7. webrtc之onicecandidate的 event handler的一点疑惑
  8. Python批量导入Excel文件中的不重复数据到SQLite数据库
  9. python爬取学籍_仝卓学籍造假微博道歉,用Python抓取微博的评论看看群众都说什么...
  10. 禁止更改计算机名_PiNetwork如何更改名字教程
  11. 软件开发管理:管开发如治军
  12. Visual Studio2017 MSDN安装
  13. 宏碁传奇14 Swift 指纹模块失效解决
  14. 2019年最新-等保测评机构、等保测评公司、信息安全厂商大全
  15. matConvNet学习-使用GPU
  16. python转化excel数字日期为标准日期
  17. swift ring
  18. 大学四年,因为这40个开发工具,我成为别人眼中的大神
  19. context.write
  20. 虚拟机运行安卓ISO

热门文章

  1. 利用OpenCV+ConvNets检测几何图形
  2. TricycleGAN:基于形状先验的无监督图像合成和分割
  3. python06-集合和序列
  4. Win10环境Tensorflow-GPU13.1/JupyterNotebook的安装
  5. 调整Windows操作系统下时间同步的频率
  6. 设计模式入门之原型模式Prototype
  7. 学习SQLite之路(五) C/C++ SQLite开发实例
  8. .Net+SQL Server企业应用性能优化笔记3——SQL查询语句
  9. 模仿android谷歌地图功能开发记录
  10. setleft android,android TextView的setCompoundDrawables()方法