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 ...
随机推荐
- 使用Jquery做分页效果
之前写过一个PHP 的分页效果,但是今天小伙伴和我说了一个不适用后台单纯用前段的JS来写分页,整理了一下,代码如下: html: <div id="containet"> ...
- eclipse export runnable jar
如果要导出可运行的JAR文件,需要选择Runnable Jar File. 方法/步骤 1. 选择要到处JAR文件的工程,右键选择“Export”: 2. 选择“Java-->Run ...
- 进程保护--CrossThreadFlags标志位
原理: 1. 将进程的所有线程的线程CrossThreadFlags标志位设置成Terminated或者System. 效果:任务管理器,WSYSCheck,ICESWORD无法结束进程.. 但PCH ...
- 【mysql】mysql front 提示Access violation at address 010C9CD0 in module ‘mysql-front.exe’
1 错误描述: 利用mysql-front 工具新建数据库.提示了一下错误 2 解决办法: 内存越界问题,最好重新注册下Windows的动态链接库 首先“开始”—“cmd” 在打开的dos窗口中运行
- HTTP/2笔记之开篇
前言 本系列基于HTTP/2第17个草案文档,地址就是:https://tools.ietf.org/html/draft-ietf-httpbis-http2-17. HTTP/2规范已经通过发布批 ...
- JDBC处理文本和二进制文件
JDBC支持文本(CLOB)和二进制(BLOB)文件的处理,比如要往数据库里存取文章或者图片.这都是用流的思想来解决的. 来两个Demo看看JDBC是怎么操作文本和二进制文件的. CLOB: pack ...
- Android UsageStats:应用根据启动次数、启动时间、应用名称排序
Android 7.1.1 developers/samples/android/system/AppUsageStatistics/Application/src/main/java/com/exa ...
- jQuery中的ajax用法案例
什么是 AJAX? AJAX = 异步 JavaScript 和 XML(Asynchronous JavaScript and XML). 简短地说,在不重载整个网页的情况下,AJAX 通过后台加载 ...
- ORA-01153: an incompatible media recovery is active
ORA-01153: an incompatible media recovery is active Cause: Attempted to start an incompatible media ...
- thinkphp发起网络请求
常规做法使用CURL方法: private function http_request($url,$data = null,$headers=array()){ $curl = curl_init() ...