原题链接: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+Opencv实现摄像头调用RGB图像并转换成HSV模型

    在ROS机器人的应用开发中,调用摄像头进行机器视觉处理是比较常见的方法,现在把利用opencv和python语言实现摄像头调用并转换成HSV模型的方法分享出来,希望能对学习ROS机器人的新手们一点帮助 ...

  2. 搭建本地虚拟服务器linux(CentOS 7)的python虚拟环境(Hyper-V演示)

    新建虚拟机->安装CentOS7->新建虚拟交换机:内部网络->CentOS7设置->网络适配器:虚拟交换机:新建虚拟交换机->进入CentOS # cd /etc/sy ...

  3. Python9-网络编程3-day32

    解决黏包的问题 #server import socket sk = socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen() conn,addr ...

  4. LeetCode(217)Contains Duplicate

    题目 Given an array of integers, find if the array contains any duplicates. Your function should retur ...

  5. cf 1006E

    #include <iostream> #include <cstdio> #include <cstring> #include <string> # ...

  6. 20,序列化模块 json,pickle,shelve

    序列化模块 什么叫序列化? 将原本的字典,列表等内容转换成一个字符串的过程叫做序列化. 序列化的目的? 数据结构 通过序列化 转成 str. str 通过反序列化 转化成数据结构. json: jso ...

  7. oracle 控制文件的重建

    目录 oracle 控制文件的重建 NORESETLOGS RESETLOGS oracle 控制文件的重建 不到最后时刻,如三个控制文件都已损坏,又没有控制文件的备份.还是不要重建控制文件,处理不好 ...

  8. DS作业06-图

    1.本周学习总结(0--2分) 1.1思维导图 1.2谈谈你对图结构的认识及学习体会. 图这一章的学习,是经过树学习后,难得一章重新寻找到感觉的学习.因为这一章比较少用递归,使用的是结构体,很多东西我 ...

  9. LaTeX:毕设模版设计问题1 各级标题编号设为黑体

    我用'titlesec'宏包设计各级标题格式指定字体为黑体,结果标题编号仍为Times New Roman .

  10. Problem 1004: 蛤玮打扫教室(区间覆盖端点记录)

    Problem 1004: 蛤玮打扫教室 Time Limits:  1000 MS   Memory Limits:  65536 KB 64-bit interger IO format:  %l ...