二分+分数规划+dfs判环

跟1486很像,但是我忘记怎么判环了,

我们可以写一个dfs,如果当前节点的距离小于更新的距离,而且这个点已经在当前访问过了,那么就是有环了,如果没有访问过就继续dfs,每个点枚举dfs就行了。

如果这个点距离大于更新距离,那么没必要访问,因为刚才都没有判出来正环,现在这个距离更小,走原先的路更不可能出现正环了

其实想了想,主要是可能有多个连通块,因为如果一个连通块有环,那么在连通块的任何一个点都能查到环,所以主要是不同的连通块导致的,dfs判环只要一次就行了,不像spfa要n次才行

#include<bits/stdc++.h>
using namespace std;
const int N = ;
struct ed {
int to;
double w;
ed(int to = , double w = ) : to(to), w(w) {}
};
struct Edge {
int u, v;
double t;
Edge(int u = , int v = , double t = ) : u(u), v(v), t(t) {}
} edge[N * ];
int n, m;
int cnt[N], q[N * ], vis[N];
double d[N], f[N];
vector<ed> G[N];
bool dfs(int u)
{
vis[u] = ;
for(int i = ; i < G[u].size(); ++i)
{
ed e = G[u][i];
if(d[e.to] < d[u] + e.w)
{
if(vis[e.to]) return true;
d[e.to] = d[u] + e.w;
if(dfs(e.to)) return true;
}
}
vis[u] = ;
return false;
}
bool check(double mid)
{
for(int i = ; i <= n; ++i)
{
d[i] = -1e9;
vis[i] = ;
G[i].clear();
}
for(int i = ; i <= m; ++i) G[edge[i].u].push_back(ed(edge[i].v, f[edge[i].u] - mid * edge[i].t));
for(int i = ; i <= n; ++i) if(dfs(i)) return true;
return false;
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = ; i <= n; ++i) scanf("%lf", &f[i]);
for(int i = ; i <= m; ++i) scanf("%d%d%lf", &edge[i].u, &edge[i].v, &edge[i].t);
double l = , r = , ans;
while(r - l > 1e-)
{
double mid = (l + r) / 2.0;
if(check(mid)) l = ans = mid;
else r = mid;
}
printf("%.2f\n", ans);
return ;
}

最新文章

  1. Mac入门 (二) 使用VMware Fusion虚拟机
  2. Range Sum Query - Mutable
  3. 数据结构-&gt;直接插入排序
  4. Windows WMIC命令使用详解
  5. Java学习笔记 01 基本数据类型、标识符、关键字和运算符
  6. Android微信登陆
  7. threadid=1: thread exiting with uncaught.exception ......解决方法
  8. 用PhpStorm IDE创建GG App Engine PHP应用教程
  9. 百度地图API 学习网站
  10. 初步了解SequoiaDB数据库
  11. 实例源码--Android时钟源码
  12. laravel5.1关于lists函数的bug
  13. IntelliJ远程调试教程
  14. linux性能优化
  15. Javascript刷新页面的几种方法:
  16. MySQl5.6最新安装
  17. Mac编程(QT有许多专门的资料)
  18. 知识点1-2:ASP.NET MVC背景
  19. Intellij +Maven 报错: Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable and mvn script match.
  20. poj 1873 凸包+枚举

热门文章

  1. Monkey进行测试时如何屏蔽掉状态栏和音量键
  2. JavaScript--小白入门篇2
  3. 记VS2008安装及使用及卸载的艰辛历程!!!(2018/11/6-2018/11/14)
  4. Django-REST_Framework 第三方登录
  5. 基于python、jupyter-notebook 的金融领域用户交易行为分析
  6. shoppping collection
  7. java8的LocalDateTime真心好用(补充Period.between的大坑)
  8. 关于${ctx}拿不到值的问题
  9. CF558E A simple task 线段树
  10. codevs1031 质数环