给定一一个n个点m条边的加权有向图, 平均值最小的回路。

二分答案,对于每个二分的mid 做一次Bellman-Fprd , 假设有k条边组成的回路。 回路上各条边的权值为  w1 , w2 ..wk ,

那么平均值小于mid意味着w1+w2+w3..+wk< k*mid 即:

(w1 - min)+(w2-mid)+...+(w2-mid)<0;

也就是说 这k条边能组成 一个负环,用 Bellman_Ford 来检查

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
const int maxn = ;
int cmp(double a ,double b){
if(fabs(a-b)<=0.00000001) return ;
return a-b>?:-;
}
struct Edge{
int from,to;
double dist;
};
struct BellmanFord{
int n,m;
vector<Edge> edges;
vector<int> G[maxn];
bool inq[maxn];
double d[maxn];
int p[maxn];
int cnt[maxn];
void inti(int n){
m=;
this->n = n;
for(int i=; i<n; ++i ) G[i].clear();
edges.clear();
}
void AddEdge(int form, int to, double dist){
edges.push_back((Edge){form,to,dist});
m =edges.size();
G[form].push_back(m-);
}
bool negativeCycle(){
queue<int> Q;
memset(inq, , sizeof(inq));
memset(cnt, , sizeof(cnt));
for(int i=; i < n; ++i) { d[i] =; inq[i] = true; Q.push(i);}
while(!Q.empty()){
int u = Q.front(); Q.pop();
inq[u] = false;
for(int i=; i<G[u].size(); i++){
Edge &e = edges[G[u][i]];
if(cmp(d[e.to] , d[u] + e.dist)>){
d[e.to] = d[u] +e.dist;
p[e.to] = G[u][i];
if(!inq[e.to]){
Q.push(e.to); inq[e.to] = true;
if(++cnt[e.to]>n) return true;
}
}
}
}
return false;
}
}solver;
bool test(double x){
for(int i=; i<solver.m; i++){
solver.edges[i].dist-=x;
}
bool ret = solver.negativeCycle();
for(int i= ; i<solver.m; i++)
solver.edges[i].dist+=x;
return ret;
}
int main()
{
int T;
scanf("%d",&T);
for(int kase =; kase<=T; kase++){
int n,m;
scanf("%d%d",&n,&m);
solver.inti(n);
int ub =;
while(m--){
int u,v,w;
scanf("%d%d%d",&u,&v,&w); u--,v--; ub= max(ub,w);
solver.AddEdge(u,v,w);
}
printf("Case #%d: ",kase);
double ans = ub;
if(!test(ub+)){
printf("No cycle found.\n");
}else{
double L =,R= ub;
while(R-L>1e-){
double M = L+(R-L)/;
if(test(M)){
R=M;
}else {
L=M;
}
}
printf("%.2lf\n",L);
} }
return ;
}

uva11090 Bellman-Ford 运用的更多相关文章

  1. ACM/ICPC 之 最短路径-Bellman Ford范例(POJ1556-POJ2240)

    两道Bellman Ford解最短路的范例,Bellman Ford只是一种最短路的方法,两道都可以用dijkstra, SPFA做. Bellman Ford解法是将每条边遍历一次,遍历一次所有边可 ...

  2. poj1860 bellman—ford队列优化 Currency Exchange

    Currency Exchange Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 22123   Accepted: 799 ...

  3. uva 558 - Wormholes(Bellman Ford判断负环)

    题目链接:558 - Wormholes 题目大意:给出n和m,表示有n个点,然后给出m条边,然后判断给出的有向图中是否存在负环. 解题思路:利用Bellman Ford算法,若进行第n次松弛时,还能 ...

  4. Bellman—Ford算法思想

    ---恢复内容开始--- Bellman—Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题.对于给定的带权(有向或无向)图G=(V,E),其源点为s,加权函数w是边集E的映射.对图G ...

  5. Bellman - Ford 算法解决最短路径问题

    Bellman - Ford 算法: 一:基本算法 对于单源最短路径问题,上一篇文章中介绍了 Dijkstra 算法,但是由于 Dijkstra 算法局限于解决非负权的最短路径问题,对于带负权的图就力 ...

  6. Dijkstra算法与Bellman - Ford算法示例(源自网上大牛的博客)【图论】

    题意:题目大意:有N个点,给出从a点到b点的距离,当然a和b是互相可以抵达的,问从1到n的最短距离 poj2387 Description Bessie is out in the field and ...

  7. POJ 2240 Arbitrage (Bellman Ford判正环)

    Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions:27167   Accepted: 11440 Descri ...

  8. poj1860 兑换货币(bellman ford判断正环)

    传送门:点击打开链接 题目大意:一个城市有n种货币,m个货币交换点,你有v的钱,每个交换点只能交换两种货币,(A换B或者B换A),每一次交换都有独特的汇率和手续费,问你存不存在一种换法使原来的钱更多. ...

  9. ACM/ICPC 之 Bellman Ford练习题(ZOJ1791(POJ1613))

    这道题稍复杂一些,需要掌握字符串输入的处理+限制了可以行走的时间. ZOJ1791(POJ1613)-Cave Raider //限制行走时间的最短路 //POJ1613-ZOJ1791 //Time ...

  10. poj3259 bellman——ford Wormholes解绝负权问题

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 35103   Accepted: 12805 Descr ...

随机推荐

  1. 使用Jquery做分页效果

    之前写过一个PHP 的分页效果,但是今天小伙伴和我说了一个不适用后台单纯用前段的JS来写分页,整理了一下,代码如下: html: <div id="containet"> ...

  2. eclipse export runnable jar

    如果要导出可运行的JAR文件,需要选择Runnable Jar File. 方法/步骤     1. 选择要到处JAR文件的工程,右键选择“Export”:   2. 选择“Java-->Run ...

  3. 进程保护--CrossThreadFlags标志位

    原理: 1. 将进程的所有线程的线程CrossThreadFlags标志位设置成Terminated或者System. 效果:任务管理器,WSYSCheck,ICESWORD无法结束进程.. 但PCH ...

  4. 【mysql】mysql front 提示Access violation at address 010C9CD0 in module ‘mysql-front.exe’

    1 错误描述: 利用mysql-front 工具新建数据库.提示了一下错误 2 解决办法: 内存越界问题,最好重新注册下Windows的动态链接库 首先“开始”—“cmd” 在打开的dos窗口中运行

  5. HTTP/2笔记之开篇

    前言 本系列基于HTTP/2第17个草案文档,地址就是:https://tools.ietf.org/html/draft-ietf-httpbis-http2-17. HTTP/2规范已经通过发布批 ...

  6. JDBC处理文本和二进制文件

    JDBC支持文本(CLOB)和二进制(BLOB)文件的处理,比如要往数据库里存取文章或者图片.这都是用流的思想来解决的. 来两个Demo看看JDBC是怎么操作文本和二进制文件的. CLOB: pack ...

  7. Android UsageStats:应用根据启动次数、启动时间、应用名称排序

    Android 7.1.1 developers/samples/android/system/AppUsageStatistics/Application/src/main/java/com/exa ...

  8. jQuery中的ajax用法案例

    什么是 AJAX? AJAX = 异步 JavaScript 和 XML(Asynchronous JavaScript and XML). 简短地说,在不重载整个网页的情况下,AJAX 通过后台加载 ...

  9. ORA-01153: an incompatible media recovery is active

    ORA-01153: an incompatible media recovery is active Cause: Attempted to start an incompatible media ...

  10. thinkphp发起网络请求

    常规做法使用CURL方法: private function http_request($url,$data = null,$headers=array()){ $curl = curl_init() ...