原题链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2031

题意

给你一个有向图,问你定义一个环的平均值为这个环上所有边的平均值,问你最小的环的平均值是多少。

题解

一种做法是强行把所有环搞出来,然后检查即可。不过这种做法好难写。。。。

我的做法是二分答案:若当前的二分值是mid,让所有的边都减去这个值,如果此时图中出现负环,则说明有环的平均值比这个更小(为什么请脑补)。

代码

#include<iostream>
#include<vector>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<iomanip>
#include<cstdio>
#define MAX_N 66
#define INF 50000000000
#define eps 1e-4
using namespace std; typedef long long ll; int T;
int n,m; struct edge {
public:
int to;
double cost; edge(int t, double c) : cost(c), to(t) { } edge() { }
}; vector<edge> G[MAX_N];
int cas = ; queue<int> que;
bool inQue[MAX_N];
double d[MAX_N];
int cnt[MAX_N]; bool vis[MAX_N]; bool spfa(int s) {
fill(d, d + n + , INF);
while (que.size())que.pop();
memset(inQue, , sizeof(inQue));
que.push(s);
inQue[s] = ;
d[s] = ;
memset(cnt, , sizeof(cnt));
cnt[s]++;
while (que.size()) {
int u = que.front();
vis[u]=;
que.pop();
inQue[u] = ;
for (int i = ; i < G[u].size(); i++) {
int v = G[u][i].to;
double t = G[u][i].cost + d[u];
if (t < d[v]) {
d[v]=t;
if(!inQue[v]) {
que.push(v);
inQue[v] = ;
cnt[v]++;
if (cnt[v] > n)return true;
}
}
}
}
return false;
} bool check(double mid) {
for (int i = ; i <= n; i++)
for (int j = ; j < G[i].size(); j++)
G[i][j].cost -= mid;
bool flag;
memset(vis, , sizeof(vis));
for (int i = ; i <= n; i++) {
if (!vis[i]) {
flag = spfa(i);
if(flag)break;
}
}
for (int i = ; i <= n; i++)
for (int j = ; j < G[i].size(); j++)
G[i][j].cost += mid;
return flag;
} int main() {
cin.sync_with_stdio(false);
cin >> T;
while (T--) {
cin >> n >> m;
for (int i = ; i <= n; i++)G[i].clear();
int u, v;
double c;
for (int i = ; i < m; i++) {
cin >> u >> v >> c;
G[u].push_back(edge(v, c));
} double l = , r = ;
while (l + eps < r) {
double mid = (l + r) / ;
if (check(mid))r = mid;
else l = mid;
}
if (!(fabs(r-)<eps))
cout << "Case #" << ++cas << ": " << setprecision() << fixed << l << endl;
else
cout << "Case #" << ++cas << ": No cycle found." << endl;
}
return ;
}

UVA 11090 Going in Cycle!! SPFA判断负环+二分的更多相关文章

  1. POJ 3259 Wormholes【最短路/SPFA判断负环模板】

    农夫约翰在探索他的许多农场,发现了一些惊人的虫洞.虫洞是很奇特的,因为它是一个单向通道,可让你进入虫洞的前达到目的地!他的N(1≤N≤500)个农场被编号为1..N,之间有M(1≤M≤2500)条路径 ...

  2. UVA 558 SPFA 判断负环

    这个承认自己没看懂题目,一开始以为题意是形成环路之后走一圈不会产生负值就输出,原来就是判断负环,用SPFA很好用,运用队列,在判断负环的时候,用一个数组专门保存某个点的访问次数,超过了N次即可断定有负 ...

  3. Extended Traffic LightOJ - 1074 spfa判断负环

    //判断负环 在负环内的城市输出? #include <iostream> #include <queue> #include <cstdio> #include ...

  4. spfa判断负环

    会了spfa这么长时间竟然不会判断负环,今天刚回.. [例题]poj3259 题目大意:当农场主 John 在开垦他的农场时,他发现了许多奇怪的昆虫洞.这些昆虫洞是单向的,并且可以把你从入口送到出口, ...

  5. spfa 判断负环 (转载)

    当然,对于Spfa判负环,实际上还有优化:就是把判断单个点的入队次数大于n改为:如果总的点入队次数大于所有点两倍 时有负环,或者单个点的入队次数大于sqrt(点数)有负环.这样时间复杂度就降了很多了. ...

  6. Wormholes---poj3259(最短路 spfa 判断负环 模板)

    题目链接:http://poj.org/problem?id=3259 题意是问是否能通过虫洞回到过去: 虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts. 我们把虫洞看成是一条负权路,问 ...

  7. POJ3259 Wormholes(SPFA判断负环)

    Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes ...

  8. POJ 3259 Wormholes ( SPFA判断负环 && 思维 )

    题意 : 给出 N 个点,以及 M 条双向路,每一条路的权值代表你在这条路上到达终点需要那么时间,接下来给出 W 个虫洞,虫洞给出的形式为 A B C 代表能将你从 A 送到 B 点,并且回到 C 个 ...

  9. Wormholes POJ - 3259 spfa判断负环

    //判断负环 dist初始化为正无穷 //正环 负无穷 #include<iostream> #include<cstring> #include<queue> # ...

随机推荐

  1. Python全栈之jQuery笔记

    jQuery runnoob网址: http://www.runoob.com/jquery/jquery-tutorial.html jQuery API手册: http://www.runoob. ...

  2. ubuntu更新内核后卡在自检无法开机的解决方法

    下载deb包安装,重启后卡在自检,黑屏. 重启进旧内核,仍然卡在自检,黑屏. 强制关机后再重启,在grub按e修改启动项,改成直接进命令行模式.使用 sudo apt-get remove linux ...

  3. JAVA-基础(六) Java.serialization 序列化

    序 列 化 序列化(serialization)是把一个对象的状态写入一个字节流的过程. Serializable接口 只有一个实现Serializable接口的对象可以被序列化工具存储和恢复.Ser ...

  4. oracle 可以连接数据库,vs连不上. 报错提示:ORA-12154: TNS: 无法解析指定的连接标识符

    方法1:问题:VS 连接 Data Source=ORCL_Service19;User Id=*;Password=* 连接不上 oracle 可以连接数据库,vs连不上,报错提示:ORA-1215 ...

  5. JAVA-两种后台页面跳转方式

    1.请求转发 RequestDispatcher rd = request.getRequestDispatcher("url"); rd.forward(request, res ...

  6. [python工具][1]sublime安装与配置

    http://www.cnblogs.com/wind128/p/4409422.html 1 官网下载版本  http://www.sublimetext.com/3 选择 Windows - al ...

  7. 当网络中断的时候,JTA全局事务管理,究竟会不会回滚???

    前言:有人问了我一个问题,就是说在网络中断的时候,JTA的全局事务管理,会不会回滚?当时说会回滚,但没给对方说清楚理由,也不太认同我的观点.现在总结一下. 今天一天都在看文档(也查了一些博客和网站), ...

  8. hibernate缓存机制【转】

    一.why(为什么要用Hibernate缓存?) Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能. 缓存内的数据是对物理数 ...

  9. JDBC 学习笔记(五)—— Statement

    JDBC 使用 Statement 作为 SQL 语句的执行器. Statement 通过 Connection.createStatement() 方法创建,一共支持以下6种方式执行 SQL 语句: ...

  10. 【bzoj3526】[Poi2014]Card 线段树区间合并

    题目描述 有n张卡片在桌上一字排开,每张卡片上有两个数,第i张卡片上,正面的数为a[i],反面的数为b[i].现在,有m个熊孩子来破坏你的卡片了!第i个熊孩子会交换c[i]和d[i]两个位置上的卡片. ...