题目描述

样例输入

4 5
1 2 5
2 3 5
3 1 5
2 4 3
4 1 3

样例输出

3.66666667


题解

分数规划+Spfa判负环

二分答案mid,并将所有边权减去mid,然后再判负环,若有负环则调整下界,否则调整上界,直至上下界基本重合。

证明:显然

由于有(c+d)/(a+b+k)>(c+d)/(a+b)≥min(c/a,d/b),所以两个相交环形成的新环一定不是最优解,即答案一定是简单环。

如果存在环使得边权和/点数<mid,那么就有边权和<点数*mid。

又因为环中点数和边数相等,所以有边权和小于边数*mid,移项即得:存在负环。

这个时候需要调整上界,进一步更新答案;否则不存在则调整下界。

然后这道题的坑点:需要用dfs版Spfa判负环,据说bfs版会T,不明觉厉。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define eps 1e-9
#define N 3010
#define M 10010
using namespace std;
int n , m , head[N] , to[M] , next[M] , cnt , x[M] , y[M] , vis[N];
double len[M] , dis[N] , z[M];
void add(int x , int y , double z)
{
to[++cnt] = y , len[cnt] = z , next[cnt] = head[x] , head[x] = cnt;
}
bool dfs(int x)
{
int i;
vis[x] = 1;
for(i = head[x] ; i ; i = next[i])
{
if(dis[to[i]] > dis[x] + len[i])
{
dis[to[i]] = dis[x] + len[i];
if(vis[to[i]]) return 1;
if(dfs(to[i])) return 1;
}
}
vis[x] = 0;
return 0;
}
bool judge(double mid)
{
int i;
memset(head , 0 , sizeof(head));
memset(vis , 0 , sizeof(vis));
memset(dis , 0 , sizeof(dis));
cnt = 1;
for(i = 1 ; i <= m ; i ++ ) add(x[i] , y[i] , z[i] - mid);
for(i = 1 ; i <= n ; i ++ ) if(dfs(i)) return 1;
return 0;
}
int main()
{
int i;
double l = 100000000.0 , r = -100000000.0 , mid;
scanf("%d%d" , &n , &m);
for(i = 1 ; i <= m ; i ++ ) scanf("%d%d%lf" , &x[i] , &y[i] , &z[i]) , l = min(l , z[i]) , r = max(r , z[i]);
while(l <= r)
{
mid = (l + r) / 2;
if(judge(mid)) r = mid - eps;
else l = mid + eps;
}
printf("%.8lf\n" , (l + r) / 2);
return 0;
}

最新文章

  1. java.lang.Class.isAssignableFrom()用法解析
  2. js之认识闭包
  3. Uva401Palindromes
  4. hdu4666 最远曼哈顿距离
  5. Tomcat 加入windows 服务自启动设置
  6. ios面试汇总
  7. 转载 感受K2.Net 2003工作流解决方案
  8. 我只是想获取access_token而已
  9. Linux用户管理的复习时间
  10. SpringBoot进阶教程(二十五)整合Redis之@Cacheable、@CachePut、@CacheEvict的应用
  11. supervisor 启动dotnet.core 报“ too many start retries too quickly”
  12. JavaScript setInterval(定时/延时调用函数)
  13. 输出图片格式BARTENDER
  14. Linux+Apache+Mysql+PHP优化技巧
  15. adb错误 - INSTALL_FAILED_NO_MATCHING_ABIS
  16. 学习构建一个简单的wcf服务
  17. 让cpu跑到100%的bat文件
  18. 初试mysql5.7.2新特性:多源复制(MySQL 5.7 multi-source replication)
  19. hadoop 集群安装配置 【转】
  20. Codeforces 877 C. Slava and tanks

热门文章

  1. element-UI时间控件:日期时间的选择范围的控制方法
  2. java基础必备单词讲解 day three
  3. $.ajax()与$.post()区别
  4. react中内联样式的z-index不起作用.
  5. uplift model学习笔记
  6. python__高级 : @修饰器(装饰器)的理解
  7. python中的集合内置方法小结
  8. 为 vsftpd 启动 vsftpd:500 OOPS: SSL: cannot load RSA&nb
  9. urllib使用三--urlretrieve下载文件
  10. Android 文件管理器通用类 FileUtil