UVA11090 Going in Cycle!!

二分答案,用spfa判负环

注意格式;图不一定连通。

复杂度$O(nmlog(maxw-minw))$

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#define re register
using namespace std;
typedef double db;
const db eps=1e-;
#define N 100
#define M 20000
int n,m,t,ri[N]; db d[N],val[M<<]; bool inh[N],vis[N];
int cnt,hd[M],nxt[M<<],ed[M],poi[M];
void adde(int x,int y,db v){
nxt[ed[x]]=++cnt; hd[x]=hd[x]?hd[x]:cnt;
ed[x]=cnt; poi[cnt]=y; val[cnt]=v;
}
bool spfa(int st,db lim){
memset(d,,sizeof(d));
memset(inh,,sizeof(inh));
memset(ri,,sizeof(ri));
queue<int> h; h.push(st);
inh[st]=; d[st]=; vis[st]=;
while(!h.empty()){
int x=h.front(); h.pop();
inh[x]=;
for(int i=hd[x];i;i=nxt[i]){
int to=poi[i];
if(d[x]+val[i]-lim<d[to]){
d[to]=d[x]+val[i]-lim;
ri[to]=ri[x]+; vis[to]=;
if(ri[to]>=n) return ;//出现次数>=n则有环
if(!inh[to])
inh[to]=,h.push(to);
}
}
}return ;
}
bool check(db lim){
memset(vis,,sizeof(vis));
bool ok=;
for(re int i=;i<=n&&!ok;++i)
if(!vis[i]) ok|=spfa(i,lim);
return ok;
}
int main(){
scanf("%d",&t); int q1,q2;db q3;
for(int w=;w<=t;++w){
memset(hd,,sizeof(hd)); cnt=;
memset(nxt,,sizeof(nxt));
memset(ed,,sizeof(ed));
scanf("%d%d",&n,&m);
db l=1e8,r=-1e8;
for(re int i=;i<=m;++i){
scanf("%d%d%lf",&q1,&q2,&q3);
adde(q1,q2,q3);
l=min(q3,l);
r=max(q3,r);
}printf("Case #%d: ",w);
if(!check(r+))//如果减去最大边+1仍无负环,这个图就是无环图
{printf("No cycle found.\n"); continue;}
while(fabs(r-l)>eps){//二分
db mid=(l+r)/2.0;
if(check(mid)) r=mid;
else l=mid;
}printf("%.2lf\n",l);
}return ;
}

UVA11090 Going in Cycle!!(二分判负环)的更多相关文章

  1. 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环)

    layout: post title: 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环) author: "luowentaoaa" catalog: ...

  2. UVA11090 Going in Cycle (二分+判负环)

    二分法+spfa判负环.如果存在一个环sum(wi)<k*x,i=0,1,2...,k,那么每条边减去x以后会形成负环.因此可用spfa来判负环. 一般spfa判负环dfs最快,用stack次之 ...

  3. BZOJ3597 [Scoi2014]方伯伯运椰子 【二分 + 判负环】

    题目链接 BZOJ3597 题解 orz一眼过去一点思路都没有 既然是流量网络,就要借鉴网络流的思想了 我们先处理一下那个比值,显然是一个分数规划,我们二分一个\(\lambda = \frac{X ...

  4. UVA 11090 Going in Cycle!!(二分答案+判负环)

    在加权有向图中求平均权值最小的回路. 一上手没有思路,看到“回路”,第一想法就是找连通分量,可又是加权图,没什么好思路,那就转换题意:由求回路权值->判负环,求最小值->常用二分答案. 二 ...

  5. poj 3621 二分+spfa判负环

    http://poj.org/problem?id=3621 求一个环的{点权和}除以{边权和},使得那个环在所有环中{点权和}除以{边权和}最大. 0/1整数划分问题 令在一个环里,点权为v[i], ...

  6. poj 2049(二分+spfa判负环)

    poj 2049(二分+spfa判负环) 给你一堆字符串,若字符串x的后两个字符和y的前两个字符相连,那么x可向y连边.问字符串环的平均最小值是多少.1 ≤ n ≤ 100000,有多组数据. 首先根 ...

  7. [APIO2017]商旅——分数优化+floyd+SPFA判负环+二分答案

    题目链接: [APIO2017]商旅 枚举任意两个点$(s,t)$,求出在$s$买入一个物品并在$t$卖出的最大收益. 新建一条从$s$到$t$的边,边权为最大收益,长度为原图从$s$到$t$的最短路 ...

  8. Poj(3259),SPFA,判负环

    题目链接:http://poj.org/problem?id=3259 Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submis ...

  9. Poj 3259 Wormholes(spfa判负环)

    Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 42366 Accepted: 15560 传送门 Descr ...

随机推荐

  1. web 前端规范实例

    <!DOCTYPE html> <html> <head> <title>tmall</title> <!-- 为了被搜索引擎作为流量 ...

  2. JDBC--Result 获取返回集合

    package jdbc.chap05; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql. ...

  3. Android 设置wifi共享电脑服务器资源

    其实win7本身就自带无线热点的功能,按下面的方法设置. 开启windows 7的隐藏功能:虚拟WiFi和SoftAP(即虚拟无线AP),就可以让电脑变成无线路由器,实现共享上网,节省网费和路由器购买 ...

  4. ansible批量验证密码

    author: headsen chen date: 2018-08-31  20:45:49 综合比较salt-ssh,ansible .sshpass等批量验证100台机器的密码,最好推荐用ans ...

  5. eclipse 改变颜色,背景

    Eclipse背景颜色修改: 操作界面默认颜色为白色.对于我们长期使用电脑编程的人来说,白色很刺激我们的眼睛,所以我经常会改变workspace的背景色,使眼睛舒服一些.设置方法如下: 1.打开win ...

  6. 【MySQL】为什么不要问我DB极限QPS/TPS

    为什么不要问我DB极限QPS/TPS 背景 相信很多开发都会有这个疑问,DB到底可以支撑多大的业务量,如何去评估?对于这个很专业的问题,DBA也没有办法直接告诉你,更多的都是靠经验提供一个看似靠谱的结 ...

  7. 删除Linux的用户

    vipw : root@ www.linuxidc.com :/home# vipw 找到你之前创建的用户,用dd删除那行(记得保存:wq or :x)..之后. root@ www.linuxidc ...

  8. .NET中将中文符号转换成英文符号

    public static string ConvertToEn(string text) { const string s1 = ".:,?!.“”‘’"; const stri ...

  9. JavaCSV之写CSV文件

    与JavaCSV读CSV文件相对应,JavaCSV也可以用来写数据到CSV文件中. 1.准备工作 (1)第三方包库下载地址:https://sourceforge.net/projects/javac ...

  10. 洛谷P3939 数颜色 二分查找

    正解:二分 解题报告: 传送门! 话说其实我开始看到这题想到的是分块,,, 但是显然不用这么复杂,,,因为仔细看下这题,会发现每次只改变相邻的兔子的位置 所以开个vector(或者开个数组也成QwQ( ...