原题链接: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 ;
}

最新文章

  1. 运行Maven工程总是报错:No goals have been specified for this build
  2. a new Poster
  3. 注解:【有连接表的】Hibernate单向N-&gt;1关联
  4. linux tcp协议状态机
  5. 在多线程环境中使用CoreData
  6. 关于&lt;a href=&#39;javascript:function()&#39;&gt;
  7. python出现Non-ASCII character &#39;\xe7&#39; in file ex6.py on line 1, but no encoding declare错误
  8. zabbix 启用分区表后需要关闭Housekeeper
  9. 【Django】中间件
  10. FB面经 Prepare: Even Tree
  11. python中防止字符串转义
  12. solr7.7.0搜索引擎使用(三)(添加文件索引)
  13. MongoDB导入导出以及数据库备份以及.dat数据
  14. 报错解决——-bash: wget: command not found
  15. Github网站加载不完全,响应超时,解决办法
  16. bzoj5007: TCP协议
  17. 廖雪峰Java4反射与泛型-1反射-4调用构造方法
  18. dbus 消息和消息总线实例讲解-二
  19. 熟悉JSON
  20. Java 内部类.md

热门文章

  1. pandas按索引插入对应值的处理方法 - join
  2. Linux网络文件系统NFS详解
  3. linux学习-systemd-journald.service 简介
  4. HDU 5111 Alexandra and Two Trees 树链剖分 + 主席树
  5. js基础之javascript的存在形式和js代码块在页面中的存放位置和 CSS 对比
  6. luogu3371 【模板】单源最短路径 dijkstra堆优化
  7. mantisbt邮件配置
  8. C++ STL 的初步认知
  9. 数据库导入Exel,输入到浏览器
  10. 第3章 jquery中的事件和动画