【题目描述】

给定一个 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. mysql中的data下的数据文件(.FRM、.MYD、.MYI)恢复为数据

    记一次mysql中的data文件操作经历 想拿到一个项目的最新的数据,做功能升级使用,备份一份数据同时也作为本地测试数据,文件有些大,我直接通过远程的phpmyadmin程序导出,不能愉快的玩耍,直接 ...

  2. Java与c#的一些细节区别

    实习中用的语言是c#,第一次接触到这种语言,然后写的过程中,发觉和Java几乎一摸一样,好像根本是无缝切换,但细节仍有很大的区别,称有空总结一波里面的部分细节实现. ps. 我写c#过程中,发觉c#有 ...

  3. spring boot(二): spring boot+jdbctemplate+sql server

    前言 小项目或者做demo时可以使用jdbc+sql server解决即可,这篇就基于spring boot环境使用jdbc连接sql server数据库,和spring mvc系列保持一致. 在sp ...

  4. 【转载】 禁止国外IP访问你的网站

    在网站的运维过程中,我们通过网站记录的IP列表记录有时候会发现很多国外的IP的访问,如美国的IP等,而很多的服务器攻击行为的发起点很有可能在国外,此时为了服务器安全的考虑,我们可以考虑禁止国外IP访问 ...

  5. c#执行sql语句的问题

    var sql = "UPDATE dbo.Purchase_Order SET StatusID = 14,StatusText='已合并', Remark=isnull(Remark, ...

  6. 【hibernate】1、Hibernate的一个注解 @Transient

    @Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性.如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic ...

  7. Jjava8 Lambda 神操作

    public class Lambda { @FunctionalInterface public interface AddInter { void add(int x, long y); } pu ...

  8. css居中的方法

  9. 03--css形状--css揭秘

    形状 一 自适应的椭圆 1.难题 1> 圆 你可能注意到过, 给任何正方形元素设置一个足够大的border-radius, 就可以把它变成一个圆形.所用到的CSS 代码如下所示: #bd { w ...

  10. loadrunner 场景设计-目标场景设计

    场景设计-目标场景设计 by:授客 QQ:1033553122 A.   概述 Goals Types for Goal-Oriented Scenarios 在以目标为向导的场景中,定义你想实现的测 ...