二分法+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. Updatepanel 中使用 Timer 控件 失去焦点问题

    在Update Panel 中 如果使用timer 定时刷新数据,会造成textbox 或者其他控件的焦点丢失问题. 所以 text box 不能和timer 放在同一个Updatepanel 中. ...

  2. HDU - 1176 免费馅饼 DP多种状态转移

    免费馅饼 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内.馅饼如果掉在了 ...

  3. SQL Server 截取两个固定字符之间的字符串(案例)

    网上的问题: 参考这篇<函数PARSENAME使用和截取字符串>https://www.cnblogs.com/insus/p/10958452.html 的方法: )='||MO21|T ...

  4. JavaScript 原型的实际应用之实现一个 jQuery

    我们平时使用jQuery大概是这样: let $p = $('p'); $p.css('fontSize', '40px'); 我们生成jQuery实例对象后,就可以使用原型上的css(), html ...

  5. PHP之递归函数

    https://www.cnsecer.com/4146.html http://www.jb51.net/article/71424.htm //一列数字的规则如下:1,1,2,3,5,8,13,2 ...

  6. matplotlib画线(2)

    这篇随笔是matplotlib画线的补充>>> #nocl参数控制图例中有几列,>>> import numpy as np>>> import ...

  7. Codeforces Round #527-D1. Great Vova Wall (Version 1)(思维+栈)

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  8. 解决lnmp无法远程登录的bug

    使用lnmp一键安装好linux环境后,不能远程连接到所在服务器的mysql,但是通过80端口可以登录phpmyadmin,发现原来是因为lnmp的大多数版本为了安全不禁止远程连接mysql,方法很简 ...

  9. Java中

  10. C. Journey

    C. Journey time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...