H - Going in Cycle!! (UVA - 11090)
- 题目大意
给你一个有向图,问你定义一个环的平均值为这个环上所有边的平均值,问你最小的环的平均值是多少。
- 解题思路
先利用spfa来判断负环,然后用二分去判断若当前的二分值是mid,让所有的边都减去这个值,如果此时图中出现负环,则说明有环的平均值比这个更小。
- 代码
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
const int N=500;
const int M=1e6+5;
const int INF=0x3f3f3f;
int n,m;
struct edge {int v,next;double w;
}e[M*2];
int head[N], cnt;
double d[N];
int inq[N];
int cn[N];
void init ()
{cnt=0;memset(head,-1,sizeof(head));
}
void addedge(int u,int v,double c)
{e[cnt].w=c;e[cnt].v=v;e[cnt].next=head[u];head[u]=cnt++;
}
bool SPFA(int s) {memset(d, INF, sizeof(d));memset(inq, 0, sizeof(inq));memset(cn, 0, sizeof(cn));queue<int> Q;Q.push(s);d[s] = 0;inq[s] = 1;while(Q.size()) {int u = Q.front();Q.pop();inq[u] = 0;for(int i = head[u]; ~i; i = e[i].next){int v = e[i].v;double w = e[i].w;if(d[v] > d[u] + w){d[v] = d[u] + w;if(!inq[v]){Q.push(v);inq[v] = 1;if(++cn[v] >= n)return false;}}}}return true;
}bool check(double x)
{bool vis=false;for(int i=1;i<=n;i++){for(int j=head[i];j!=-1;j=e[j].next)e[j].w-=x;}for(int i=1;i<=n;i++){if(!SPFA(i))vis=true;}for(int i=1;i<=n;i++){for(int j=head[i];j!=-1;j=e[j].next)e[j].w+=x;}return vis;
}int main()
{int t,a,b;double c;scanf("%d",&t);for(int k=1;k<=t;k++){double l=INF,r=0,mid;init();scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d%d%lf",&a,&b,&c);addedge(a,b,c);l=min(l,c);r=max(r,c);}printf("Case #%d: ",k);if(!check(r+1))printf("No cycle found.\n");else{while(r-l>1e-8){mid=(r+l)/2;if(check(mid))r=mid;elsel=mid;}printf("%.2lf\n",r);}}return 0;
}
转载于:https://www.cnblogs.com/alpacadh/p/8449749.html
H - Going in Cycle!! (UVA - 11090)相关推荐
- UVA 11090 Going in Cycle!! 二分答案 + bellman-ford
求平均值最小的环,如果平均值最小为x,则如果把每条边的权值都减(x+1),那么新图将会有负环,用bellman ford判断. //#pragma comment(linker, "/STA ...
- linux创建和编辑文件,linux基础-第九单元 利用vi编辑器创建和编辑正文文件
vi编辑器简介 什么是vi vi编辑器的操作模式 vi编辑器的3种基本模式 在vi编辑器中光标的移动 移动光标位置的键与光标移动间的关系 进入插入模式 从命令行模式进入插入模式的命令 在命令行模式下删 ...
- gbrl参数_grbl-0.9运行参数配置说明
grbl-0.9运行参数配置说明 2018-09-14 平台:ArduinoUNO R3 软件:Grbl 默认IO口配置 Grbl基本操作指令 参考[https://github.com/grbl/g ...
- π-Algorithmist分类题目(2)
原题网站:Algorithmist,http://www.algorithmist.com/index.php/Main_Page π-Algorithmist分类题目(2) Set Theory U ...
- 用OpenGL导演一场烟花盛会,迎接即将到来的新年
忙碌了一年,今天终于放假了.原本打算好好休息一下,没成想只过了半天就觉得有点无聊.看家人和朋友们都在忙年,那我就用OpenGL导演一场烟花盛会,献给即将到来的新年吧. 一说到OpenGL,很多人都会觉 ...
- GRBL二:串口控制命令及代码解析(转载)
因初学GRBL,网上搜集了一些GRBL的资料,怕遗忘,所以转载过来,如有侵权请联系,立即删除. 原文地址:https://blog.csdn.net/zhangjikuan/article/detai ...
- 零知识证明:重要构造
文章目录 ZKP for NP Blum's ZK PoK for HC Completeness Soundness Zero Knowledge WI of n-parallelized vers ...
- 【雕刻机】Grbl程序使用入门
平台:ArduinoUNO R3 软件:Grbl 默认IO口配置 Grbl基本操作指令 参考[https://github.com/grbl/grbl/wiki/Configuring-Grbl-v0 ...
- gbrl参数_GRBL介绍
近日项目需要,PLC中添加直线差补类的功能,第一次接触GRBL,做个大致概括. Grbl是一款针对Arduino/AVR328芯片的嵌入式G代码编译和运动控制器. 所以说GRBL分为两部分:上位机部分 ...
- Grbl程序使用入门
Grbl程序使用入门 槐之林 | 2017-07-07 22:51:14 阅读:7760 发布文章 平台:Arduino UNO R3 软件:Grbl 默认IO口配置 Grbl基本操作指令 ...
最新文章
- python可视化窗口制作一个摇骰子游戏_使用python制作一个抽奖小游戏——骰子游戏...
- 不要再问我Python2和Python3的Unicode 问题啦!
- 定位到某个单词_【侃侃单词】词根词缀记单词-loc
- 带圈汉字 在线生成_手写签名在线生成器-手写签名在线生成器可复制
- mysql 自定义函数function,函数和存储过程的区别
- se linux ll-z,Linux selinux 基础
- 中国人工智能学会通讯——融合经济学原理的个性化推荐
- HDU-1994-利息计算
- tableau三轴该怎么做_举个栗子!Tableau技巧(30):巧妙实现 双柱图 和 折线图 的组合图表...
- 超弦计算机,物理学四大神兽——拉普拉斯妖
- HTML+CSS制作的纯静态网页
- Matlab中产生门函数----Heaviside函数的调用方法
- 怎么压缩视频到最小,什么操作简单
- 【CYH-02】NOIp考砸后虐题赛:转换式:题解
- 分布式事务 - 三种常见的解决方案
- 2020.08.05狂人日记:C#计时器与串口通信
- 作为一名程序员,你知道1024程序员是怎么来的么?
- SparkSQL join
- 应用发布出现问题—— “管理系统“ (Apple ID: 123456789) 在iTunes Connect上存在问题。
- [保姆级图文教程]如何配置局域网多机共享同步文件夹