Word Rings POJ2949 (Bellman-ford算法,找平均值最大的环)

题意本身比较简单,就是找一个平均值最大的环。
在做这个题之前,我们先解决一个问题,如何找到一个平均值最小的环。

设有一个环中,有k 个点,那么这个环的平均权值X是:
X=(w1+w2+w3+,..,,,wk)/k
然后我们把k乘过去:(w1+w2+…..wk)=kX

Bellman_ford算法的一个重要作用是判断负圈,所以这个题可以利用这个特点来做。
再把(w1+w2+…..wk)=kX处理一下。

就是(w1-X)+(w2-X)+(w3-X)+(w4-X)+…+(wk-X)=0
把这个等号改成小于号:(w1-X)+(w2-X)+(w3-X)+(w4-X)+…+(wk-X)<0

所以我们首先二分这个X,把所有的边权减去X,如果说有平均权值为X的,必定会出现:
(w1-X)+(w2-X)+(w3-X)+(w4-X)+…+(wk-X)=0(w1…wk都是那个环里的点)
所以让这个X稍微大一点点,就会出现负圈了。
由于如果X很大很大的话,也可以产生这个现象。
所以我们要找的X,就是那个刚好使得有这个式子产生的,最小的这个值。
这个值就是 最小的环的平均值(确切的说比平均值稍微大一点点,这里是精度问题了)。

这个题不一样的地方在于,是求最大的,所以我们需要改变一下。
把图中所有的边改成C-w(其中C是一个大于所有w的数字,注意不要溢出)。

再在这个新图里面去找最小的平均值。

就变成了 (C-w1-X)+(C-w2-X)+(C-w3-X)+(C-w4-X)+…+(C-wk-X)=0
然后把这个式子变成了
C-X=(w1+w2.+w3+…+wk)/K
C-X就是新图里最小的平均值。
如果要C-X越小,就意味着X要越大。
所以C-X最小,就意味着X最大。

这个题就这样做出来了。

细节:
①double不可以直接比大小,要写一个eps量,这里我写了1e-3, 连1e-2都会WA的。。
②所有单词,前两个字母所表示的点的dis都是0,然后再跑Bellman-ford。

#include<iostream>
#include<string.h>
#include<string>
#include<algorithm>
#include<stdio.h>
#include<map>
#include<vector>
using 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值