bzoj1690

二分+分数规划+dfs判环

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

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

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

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

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

时间: 2024-11-05 16:06:06

bzoj1690的相关文章

bzoj1690[Usaco2007 Dec]奶牛的旅行*

bzoj1690[Usaco2007 Dec]奶牛的旅行 题意: n点m边有向图,点有点权,边有边权,奶牛想要从某点出发,走一些路使得经过的点权和除以(浮点数除法)边权和最大,求这个小数(保留两位).n≤1000,m=5000. 题解: 01分数规划!太神了,然而我看不懂证明,所以直接给出算法.假设需要所求小数最大,那么二分这个数,然后将所有边的边权改为分母(需要最小化的部分)*二分的数-分子(需要最大化的部分),然后判负环.如果有,说明解合法,否则解不合法.最后把下界输出.如果需要所求小数最小

【bzoj1690/Usaco2007 Dec】奶牛的旅行——分数规划 最优比率环

Description 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的城市地图,上面标注了城市中所有L(2 <= L <= 1000)座标志性建筑物(建筑物按1..L顺次编号),以及连接这些建筑物的P(2 <= P <= 5000)条道路.按照计划,那天早上Farmer John会开车将奶牛们送到某个她们指定的建筑物旁边,等奶牛们完成她们的整个旅行并回到出

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

前段时间准备省选没更,后段(?)时间省选考砸没心情更,最近终于开始恢复刷题了... 题目大意:有n个点m条有向边的图,边上有花费,点上有收益,点可以多次经过,但是收益不叠加,边也可以多次经过,但是费用叠加.求一个环使得收益和/花费和最大,输出这个比值. 显然这就是经典的分数规划题啊,就是最优比率环,那么就二分答案,将所有边(u,v)的边权改为[v的点权-(u,v)原边权*mid],这可以算是最优比率环的公式了吧,然后判一下是否有正环,有的话就说明答案可行.判正环有够别扭的,那就全部改成相反数然后

[Usaco2007 Dec][BZOJ1690] 奶牛的旅行|分数规划|二分|SPFA

1690: [Usaco2007 Dec]奶牛的旅行 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 700  Solved: 363[Submit][Status][Discuss] Description 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的城市地图,上面标注了城市中所有L(2 <= L <= 1000)座标志

【BZOJ1690】【Usaco2007 Dec】奶牛的旅行 分数规划 判断负环

题解: 分数规划+判断负环. 代码: #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 1010 #define M 5050 #define eps 1e-8 using namespace std; double mid,fun[N]; struct Eli { int v,n; do

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

用dfs优化的spfa判环很快啦 分数规划的题目啦 二分寻找最优值,用spfa判断能不能使 Σ(mid * t - p) > 0 最优的情况只能有一个环 因为如果有两个环,两个环都可以作为奶牛的行程,如果两个环单独计算的结果不一样,那么两个环中比值更大的才是最优解,如果结果一样,多算一个环就没有意义了. 代码如下 1 #include <cstdio> 2 #include <cstring> 3 #include <vector> 4 using namespa

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

题目描述 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的城市地图,上面标注了城市中所有L(2 <= L <= 1000)座标志性建筑物(建筑物按1..L顺次编号),以及连接这些建筑物的P(2 <= P <= 5000)条道路.按照计划,那天早上Farmer John会开车将奶牛们送到某个她们指定的建筑物旁边,等奶牛们完成她们的整个旅行并回到出发点后,将她们

NOIP前刷水行动

2016.11.10 BZOJ1592 Usaco2008 Feb]Making the Grade 路面修整:离散+DP BZOJ1051 HAOI 受欢迎的牛 :tarjan BZOJ2442 修建草坪 :单调队列优化DP BZOJ3890 Meeting time : 分层DP BZOJ4390 Max Flow :树上差分 BZOJ4525 :二分答案判定 BZOJ4511 :DP 1 BZOJ1592 2 3 #include<iostream> 4 #include<algo

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734