uva11090 Bellman-Ford 运用
给定一一个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 运用的更多相关文章
- ACM/ICPC 之 最短路径-Bellman Ford范例(POJ1556-POJ2240)
两道Bellman Ford解最短路的范例,Bellman Ford只是一种最短路的方法,两道都可以用dijkstra, SPFA做. Bellman Ford解法是将每条边遍历一次,遍历一次所有边可 ...
- poj1860 bellman—ford队列优化 Currency Exchange
Currency Exchange Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 22123 Accepted: 799 ...
- uva 558 - Wormholes(Bellman Ford判断负环)
题目链接:558 - Wormholes 题目大意:给出n和m,表示有n个点,然后给出m条边,然后判断给出的有向图中是否存在负环. 解题思路:利用Bellman Ford算法,若进行第n次松弛时,还能 ...
- Bellman—Ford算法思想
---恢复内容开始--- Bellman—Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题.对于给定的带权(有向或无向)图G=(V,E),其源点为s,加权函数w是边集E的映射.对图G ...
- Bellman - Ford 算法解决最短路径问题
Bellman - Ford 算法: 一:基本算法 对于单源最短路径问题,上一篇文章中介绍了 Dijkstra 算法,但是由于 Dijkstra 算法局限于解决非负权的最短路径问题,对于带负权的图就力 ...
- Dijkstra算法与Bellman - Ford算法示例(源自网上大牛的博客)【图论】
题意:题目大意:有N个点,给出从a点到b点的距离,当然a和b是互相可以抵达的,问从1到n的最短距离 poj2387 Description Bessie is out in the field and ...
- POJ 2240 Arbitrage (Bellman Ford判正环)
Arbitrage Time Limit: 1000MS Memory Limit: 65536K Total Submissions:27167 Accepted: 11440 Descri ...
- poj1860 兑换货币(bellman ford判断正环)
传送门:点击打开链接 题目大意:一个城市有n种货币,m个货币交换点,你有v的钱,每个交换点只能交换两种货币,(A换B或者B换A),每一次交换都有独特的汇率和手续费,问你存不存在一种换法使原来的钱更多. ...
- ACM/ICPC 之 Bellman Ford练习题(ZOJ1791(POJ1613))
这道题稍复杂一些,需要掌握字符串输入的处理+限制了可以行走的时间. ZOJ1791(POJ1613)-Cave Raider //限制行走时间的最短路 //POJ1613-ZOJ1791 //Time ...
- poj3259 bellman——ford Wormholes解绝负权问题
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 35103 Accepted: 12805 Descr ...
随机推荐
- OpenGL 4.0 GLSL 基础教程概览——VAO和VBO常用操作接口
(一) OpenGL 4.3 最新渲染管线图 从OpenGL 2.0 到 OpenGL 3.0变化非常大,但从OpenGL 3.0 到OpenGL 4.0 变化不是太大. 着色器程序直接运行在GPU ...
- List转换为数组Array的方法
List<String> list = new ArrayList<String>(); list.add("str1"); list.add(" ...
- js实现表单项的全选、反选以及删除操作
<html> <head> <title>test</title> <script language="javascript" ...
- LeetCode——Lowest Common Ancestor of a Binary Search Tree
Description: Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given no ...
- 【BZOJ5100】[POI2018]Plan metra 构造
[BZOJ5100][POI2018]Plan metra Description 有一棵n个点的无根树,每条边有一个正整数权值,表示长度,定义两点距离为在树上的最短路径的长度. 已知2到n-1每个点 ...
- Android 通过Socket 和服务器通讯
Extends:(http://www.cnblogs.com/likwo/p/3641135.html) Android 通过Socket 和服务器通讯,是一种比较常用的通讯方式,时间比较紧,说下大 ...
- 170804、使用Joda-Time优雅的处理日期时间
简介 在Java中处理日期和时间是很常见的需求,基础的工具类就是我们熟悉的Date和Calendar,然而这些工具类的api使用并不是很方便和强大,于是就诞生了Joda-Time这个专门处理日期时间的 ...
- 170516、ActiveMQ 的安装与使用(单节点)
ActiveMQ 的安装与使用(单节点)IP: 192.168.4.101环 境: CentOS 6.6 . JDK71. 安装 JDK 并配置环境变量(略)JAVA_HOME=/usr/local/ ...
- Mac下通过远程桌面向Windows发送Ctrl+Alt+Delete
今天在Mac中通过远程桌面给Windows安装Git Extensions,在安装程序自动关闭资源管理器时,Windows无响应,桌面显示黑屏.于是,想通过Ctrl+Alt+Delete快捷键调出对话 ...
- Drools规则引擎
一.简介 Drools is a Business Rules Management System (BRMS) solution. It provides a core Business Rules ...