二分+分数规划+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 ;
}

bzoj1690的更多相关文章

  1. BZOJ1690 Usaco2007 Dec 奶牛的旅行 【01分数规划】

    BZOJ1690 Usaco2007 Dec 奶牛的旅行 题目描述 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得 ...

  2. BZOJ1690: [Usaco2007 Dec]奶牛的旅行

    1690: [Usaco2007 Dec]奶牛的旅行 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 552  Solved: 286[Submit][St ...

  3. bzoj1690:[Usaco2007 Dec]奶牛的旅行(分数规划+spfa判负环)

    PS:此题数组名皆引用:戳我 题目大意:有n个点m条有向边的图,边上有花费,点上有收益,点可以多次经过,但是收益不叠加,边也可以多次经过,但是费用叠加.求一个环使得收益和/花费和最大,输出这个比值. ...

  4. 【bzoj1690】[Usaco2007 Dec]奶牛的旅行 分数规划+Spfa

    题目描述 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的城市地图,上面标 ...

  5. bzoj1690:[Usaco2007 Dec]奶牛的旅行 (分数规划 && 二分 && spfa)

    用dfs优化的spfa判环很快啦 分数规划的题目啦 二分寻找最优值,用spfa判断能不能使 Σ(mid * t - p) > 0 最优的情况只能有一个环 因为如果有两个环,两个环都可以作为奶牛的 ...

  6. [bzoj1690] [Usaco2007 Dec] 奶牛的旅行 (最大比率环)

    题目 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的城市地图,上面标注了 ...

  7. 8.11-8.16:usaco

    summary:57 bzoj1741:裸二分图最大匹配 #include<cstdio> #include<cstring> #include<iostream> ...

  8. 由zImage生成uImage

    一.手动使用mkimage命令 mkimage -A arm -O linux -T kernel -C none -a 30007fc0 -e 30007fc0 -n uImage   -d /wo ...

  9. NOIP前刷水行动

    2016.11.15 BZOJ1009:DP+矩阵乘法+KMP BZOJ1898:矩阵乘法 BZOJ4101:贪心,考虑我们往右边撞的时候,我们会向左边冲 ,于是枚举答案点利用一个指针计算即可! 20 ...

随机推荐

  1. Oracle 回滚(ROLLBACK)和撤销(UNDO)

    一.回滚(ROLLBACK)和撤销(UNDO) 回滚和前滚是保证Oracle数据库中的数据处于一致性状态的重要手段. 在9i版本以前 Oracle使用数据库中的回滚段来实现未提交数据或因系统故障导致实 ...

  2. 每日命令:(10)cat

    cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 1.命令格式: cat [选项] [文件] ...

  3. ORM优化

    orm优化数据库访问:https://docs.djangoproject.com/en/1.11/topics/db/optimization/ 一.QuerySet 可迭代 querysey=mo ...

  4. Python学习第二阶段Day2,模块time/datetime、random、os、sys、shutil

    1.Time.  Datetime(常用) UTC时间:为世界标准时间,时区为0的时间 北京时间,UTC+8东八区 import time print(time.time()) # timestamp ...

  5. 深入理解PHP之strpos

    概述 在php中经常用 strpos 判断字符串是否在另一个字符串中存在, 本文介绍 strpos 函数及其实现. strpos应用 <?php /* strpos示例 */ // test e ...

  6. 来说一说chrome扩展和chrome插件到底有什么区别?

    想讨论chrome扩展和chrome插件区别这个话题很久了!但是迟迟没有写.因为我自己也没有搞清楚这两者之间的区别!回想当初是因为需要寻找番羽墙插件才想到去搜索到chrome插件. 想讨论chrome ...

  7. Android jdbc连接mysql报错解决方案 (Communications link failure)

    最近调试安卓连接mysql真是心态爆炸,快两天才搞出来.以下整理一些常见问题. 检查manifest文件里网络权限是否打开 检查数据库IP是否有问题(包括一些沙雕错误,比如是不是在ip首或尾多了个空格 ...

  8. 爬楼梯,N级楼梯有多少种走法?

    https://blog.csdn.net/tcpipstack/article/details/45173685 一个人爬楼梯,一步可以迈一级,二级,三级台阶,如果楼梯有N级,要求编写程序,求总共有 ...

  9. Ajax_数据格式_XML

    [XML] 优点: --XML是一种通用的数据格式. --不必把数据强加到已经定义好的格式中,而是要为数据自定义合适的标记. --利用DOM可以完全掌控文档. 缺点: --如果文档来自于服务器,就必须 ...

  10. Linux学习总结(18)——Linux使用init命令关机、重启、切换模式

    reboot可能是每个用过Linux的人都知道的命令,但有一个命令"init"才是命令中的精英. 最近有个同事学习安装了CentOS,明明安装的是带桌面的系统,但是启动后进入了命令 ...