【题目描述】

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

【输入格式】

输入第一行为数据组数 T 。每组数据第一行为图的点数 n 和边数 m (n ≤ 50)。以下 m 行每行3个整数 u, v, w, 表示有一条从 u 到 v 的有向边,权值为 w。输入没有自环。

【输出格式】

对于每组数据,输出平均最小值,并保留2位小数。如果误解,输出 "No cycle found."。

这道题吧,我觉得使用二分法求解不错。首先才一个值 mid,只需要判断是否存在平均值小于 mid 的回路。那么如何判断呢?假设存在一个包含 k 条边的回路,回路上各条边的权值为 w₁, w₂, w₃......(k 个),那么平均值小于 mid 意味着 w₁ + w₂ + w₃ +...... (k 个)< k * mid,即:

        (w₁ - mid) + (w₂ - mid) + (w₃ - mid) + ......(k 组) < 0

这么看来,只要把每条边 (a, b) 的权 w(a, b) 变成 w(a, b) - mid,在判断图中是否有负全回路(负圈)即可。至于如何盘负圈,用 spfa 搜一遍图,若一个结点入队 n 次,那么就一定存在负圈。

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = ;
const int maxx = 1e6 + ;
const double INF = 1e300; //double型一个很大的数
vector<int>v[maxn];
vector<double>c[maxn];
int cnt[maxn], vis[maxn]; //cnt[]入队次数
double dis[maxn];
int n, m;
void init()
{
for(int i = ; i < maxn; ++i)
{
v[i].clear(); c[i].clear();
}
}
bool spfa(double x)
{
for(int i = ; i < maxn; ++i) { cnt[i] = vis[i] = ; dis[i] = INF;}
queue<int>q;
for(int i = ; i <= n; ++i)
{
q.push(i); cnt[i]++; dis[i] = ;
} while(!q.empty())
{
int now = q.front(); q.pop();
vis[now] = ;
for(int i = ; i < v[now].size(); ++i)
{
if(dis[now] + c[now][i] - x < dis[v[now][i]]) //别忘减去 x!!
{
dis[v[now][i]] = dis[now] + c[now][i] - x;
if(!vis[v[now][i]])
{
q.push(v[now][i]); vis[v[now][i]] = ; cnt[v[now][i]]++; if(cnt[v[now][i]] > n) return true;
}
}
}
}
return false;
}
int main()
{
int T; scanf("%d", &T);
for(int kase = ; kase <= T; ++kase)
{
init();
printf("Case #%d: ", kase);
scanf("%d%d", &n, &m);
for(int i = ; i <= m; ++i)
{
int a, b, cost; scanf("%d%d%d", &a, &b, &cost);
v[a].push_back(b);
c[a].push_back(cost);
}
if(!spfa(maxx)) printf("No cycle found.\n"); //不存在负圈
else
{
double L = , R = maxx; //二分法求值
while(R - L > 1e-)
/*因为保留两位小数,所以只用让 L和 R相差小于0.01即可,这里选择0.001
注意:不能写 R == L,因为存在浮点误差,两个double型实数不能相等)*/
{
double mid = (L + R) / ;
if(spfa(mid)) R = mid;
else L = mid;
}
printf("%.2lf\n", L);
}
}
}

在环中(Going in Cycle!!, UVa 11090)的更多相关文章

  1. Going in Cycle!! UVA - 11090(二分+判断环路 )

    题意: 给定一个n个点m条边的加权有向图,求平均权值最小的回路 解析: 首先肯定是想到找出环路  然后..呵..呵..呵呵... 显然不现实!! 二分大法好 ....去猜结果 然后带入验证 ...真是 ...

  2. 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环)

    layout: post title: 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环) author: "luowentaoaa" catalog: ...

  3. UVA 11090 - Going in Cycle!!(Bellman-Ford)

    UVA 11090 - Going in Cycle!! option=com_onlinejudge&Itemid=8&page=show_problem&category= ...

  4. UVA - 11090 - Going in Cycle!!(二分+差分约束系统)

    Problem  UVA - 11090 - Going in Cycle!! Time Limit: 3000 mSec Problem Description You are given a we ...

  5. UVA 11090 Going in Cycle!! SPFA判断负环+二分

    原题链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  6. UVA 11090 - Going in Cycle!! SPFA

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  7. Uva 11090 在环中

    题目链接:http://vjudge.net/contest/143318#problem/A 题意: 求平均权值最小的回路. 分析: 平均权值不可能超过最大边,二分查,然后,由于是平均权值,就可以转 ...

  8. UVa 11090 Going in Cycle!!【Bellman_Ford】

    题意:给出n个点m条边的加权有向图,求平均值最小的回路 自己想的是用DFS找环(真是too young),在比较找到各个环的平均权值,可是代码实现不了,觉得又不太对 后来看书= =好巧妙的办法, 使用 ...

  9. UVA 11090 Going in Cycle!!(二分答案+判负环)

    在加权有向图中求平均权值最小的回路. 一上手没有思路,看到“回路”,第一想法就是找连通分量,可又是加权图,没什么好思路,那就转换题意:由求回路权值->判负环,求最小值->常用二分答案. 二 ...

随机推荐

  1. [Luogu1365] WJMZBMR打osu! / Easy

    Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有 \(n\) 次点击要做,成功了就是o,失败了就是x,分数是按com ...

  2. TCP服务器/客户端代码示例

    TCP服务器代码: #include <errno.h> #include <string.h> #include <stdlib.h> #include < ...

  3. SpringBoot与Cloud版本匹配问题

    在使用SpringCloud的时候需要在SpringBoot工程的pom.xml中引入 <dependencyManagement> <dependencies> <de ...

  4. Java - 线程池设计与选择

    http://ifeve.com/how-to-calculate-threadpool-size/ 任务一般可分为:CPU密集型.IO密集型.混合型,对于不同类型的任务需要分配不同大小的线程池. C ...

  5. HTML--SVG基础

    一 SVG概述 SVG是Scalable Vector Graphics的缩写,即缩放式矢量图形; 优点: 1.使用编辑器即可编辑图形; 2.基于XML,SVG图形可以被很容易的搜索,脚本化和压缩; ...

  6. javascript: checked 不可全选

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 【工具相关】Web-XAMPP的安装

    一,在查度中搜索XAMPP,会如下所示,下载软件 ,依次进行安装. 二,安装完成之后,会生成如下的图标. 三,打开上图的图标,如下图所示. 四,选择Apache Web Server---->S ...

  8. 网站pc端分享QQ好友,空间,微博

    在开发pc端网站的过程中,涉及到邀请好友的功能,之前单纯的复制粘贴已经无法满足用户的体验.故,仿照移动端添加自动分享到QQ好友,QQ空间,QQ微博的功能. 分享到QQ好友:http://connect ...

  9. css制作表格

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. WebGIS中利用AGS JS+eCharts实现一些数据展示的探索

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 eCharts提供了迁徙图.热点图.夜视图等跟地图能够很好的 ...