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

一般spfa判负环dfs最快,用stack次之,queue最慢,因为一个负环中被更新的点是连续的。

一开始不知到图的连通情况,所以把所有点都入栈更新。

#include<bits/stdc++.h>
using namespace std;
const int maxn = ; struct Edge
{
int v,nxt;
double w;
};
vector<Edge> edges;
int head[maxn];
#define PB push_back
void addEdge(int u,int v,double w)
{
edges.PB({v,head[u],w});
head[u] = edges.size()-;
} bool vis[maxn];
double d[maxn];
int cnt[maxn]; bool spfa(int n)
{
stack<int>S;
memset(vis,,sizeof(vis));
memset(cnt,,sizeof(cnt));
for(int i = ; i < n; i++) { vis[i] = true; d[i] = .; S.push(i); }
while(S.size()){
int u = S.top(); S.pop();
vis[u] = false;
for(int i = head[u]; ~i; i = edges[i].nxt){
Edge &e = edges[i];
if(d[e.v]>d[u]+e.w){
d[e.v] = d[u]+e.w;
if(!vis[e.v]){
S.push(e.v); vis[e.v] = true;
if(++cnt[e.v] > n) return true;
}
}
}
}
return false;
} bool P(double x,int n)
{
for(int i = ; i < (int)edges.size(); i++) edges[i].w -= x;
bool ret = spfa(n);
for(int i = ; i < (int)edges.size(); i++) edges[i].w += x;
return ret;
} void init()
{
memset(head,-,sizeof(head));
edges.clear();
} const double eps = 1e-; int main()
{
//freopen("in.txt","r",stdin);
int T;cin>>T;
int kas = ;
while(T--){
init();
int n,m; scanf("%d%d",&n,&m);
double l = , r = ;
while(m--){
int u,v; double w; scanf("%d%d%lf",&u,&v,&w);
addEdge(u-,v-,w);
r = max(r,w);
}
printf("Case #%d: ",++kas);
if(!P(r+,n)) { puts("No cycle found."); continue; }
for(double mid; r-l>eps; P(mid,n)?r=mid:l=mid) mid = l+(r-l)/;
printf("%.2lf\n",l);
}
return ;
}

dfs+判负环

bool vis[maxn];
double d[maxn];
bool dfs(int u)
{
vis[u] = true;
for(int i = head[u]; ~i ; i = edges[i].nxt){
Edge &e = edges[i];
if(d[e.v] > d[u]+e.w){
d[e.v] = d[u]+e.w;
if(!vis[e.v]){
if(dfs(e.v)) return true;
}else return true;
}
}
vis[u] = false;
return false;
} 调用
for(int u = ; u < n; u++){
if(dfs(u)) { ret = true; break; }
}

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

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

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

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

    UVA11090 Going in Cycle!! 二分答案,用spfa判负环. 注意格式:图不一定连通. 复杂度$O(nmlog(maxw-minw))$ #include<iostream& ...

  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. Unity ShaderLab 光照随笔

    unity camera默认3种渲染路径,unity5.50里面有4种 camera Rendering Path 1 vertexLit(逐顶点,一般在vert中处理)  2 forward (前向 ...

  2. 以太坊开发教程(二) 利用truffle发布宠物商店 DAPP 到 以太坊测试环境Ropsten

    1.环境安装 1) node安装 设置镜像地址: curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -下载安装 ...

  3. 以太坊开发教程(一) truffle框架简介/安装/使用

    通常一个DAPP的开发包括两部分:智能合约的开发和提供合约进行调用的前端页面. truffle提供了对这两部分内容比较简单的开发方式,特别是在开发/测试阶段.给开发人员提供快捷的打包/部署,已经本地服 ...

  4. IT兄弟连 JavaWeb教程 jQuery对AJAX的支持经典案例

    案例需求:编写用户登陆页面的验证码模块,在用户进行登陆时,输入验证码后不需要点击提交按钮,使用AJAX异步地向服务器发送验证验证码的请求.如果验证码正确,可以点击提交按钮,如果验证码输入错误,提示用户 ...

  5. python 定位

    #字符串定位 使用str.find() 其结果为如下: #列表中元素的定位 使用list.index() 其结果如下:

  6. 一个模块对应一个Servlet对应一张表 BaseServlet抽取反射进行方法转发实现

  7. JAVAFX-1 开发应用

    为什么用javafx? 写这个专题的目的,其实也是好玩,原来的熟悉的使用swing 来开发java中的gui程序,其实早就知道有javafx 这个东西的,一致没有时间的玩,最近有时间所以学习.这个专题 ...

  8. 1e9个兵临城下(容斥原理)

    链接:https://ac.nowcoder.com/acm/contest/321/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  9. Nginx托管.Net Core应用程序

    Nginx托管.Net Core应用程序 一.安装.Net Core 参考官方文档:https://www.microsoft.com/net/core#linuxcentos 1.添加dotnet产 ...

  10. NET Core 防止跨站请求

    ASP.NET Core 防止跨站请求伪造(XSRF/CSRF)攻击 什么是反伪造攻击? 跨站点请求伪造(也称为XSRF或CSRF,发音为see-surf)是对Web托管应用程序的攻击,因为恶意网站可 ...