CF605E Intergalaxy Trips

传送门


思路

注意到最优策略,那么对于一个点,一定是走到最小的期望天数的点上

所以我们应该有转移方程:

\[f_n = 0 \]

\[f_i=\sum f_j·p_{i,j}\prod_{f_k<f_j}(1-p_{i, k}) \]

\(1-p_{i, k}\) 就是一个道路关闭的概率)

但这默认了一定至少有一条路能走出去,万一一条都不开放就不行了

因此还要加上 \(f_i\prod_{j\not = i}\ 1-p_{i, j}\)

整理得:

\[f_i=\frac{\sum f_j·p_{i,j}\prod_{f_k<f_j}(1-p_{i, k})}{1-\prod_{k\not = i}\ 1-p_{i, k}} \]

显然,转移时存在 \(k\),满足 \(i\in [1, n],\ f_k \le f_i\)

那我们就从这个点转移到其他点,同时就可以更新 \(\prod_{f_k<f_j}(1-p_{i, k})\)\(\prod_{j\not = i}\ 1-p_{i, j}\)

这过程类似于最短路的 \(dij\)

注意我们这里计算 \(f_i\) 时,先不要除以那个东西,在求最小转移点和输出时再除


代码

#include<iostream>
#include<fstream>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#define LL long long
#define FOR(i, x, y) for(int i = (x); i <= (y); i++)
#define ROF(i, x, y) for(int i = (x); i >= (y); i--)
#define PFOR(i, x) for(int i = he[x]; i; i = r[i].nxt)
inline int reads()
{
    int sign = 1, re = 0; char c = getchar();
    while(c < '0' || c > '9'){if(c == '-') sign = -1; c = getchar();}
    while('0' <= c && c <= '9'){re = re * 10 + (c - '0'); c = getchar();}
    return sign * re;
}
int n; double a[1005][1005], p[1005], f[1005];
std::bitset<1005> vis;
signed main()
{
#ifndef ONLINE_JUDGE
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    n = reads();
    FOR(i, 1, n) FOR(j, 1, n) a[i][j] = 1.0 * reads() / 100.0;
    if(n == 1) {puts("0"); return 0;}
    vis[n] = 1;
    FOR(i, 1, n - 1)
    {
        f[i] = 1;
        p[i] = 1.0 - a[i][n];
    }
    FOR(i, 1, n - 1)
    {
        int now = 0; double Mn = 1e18;
        FOR(j, 1, n - 1)
            if(!vis[j] && Mn > f[j] / (1 - p[j]))
                now = j, Mn = f[j] / (1 - p[j]);
        vis[now] = 1;
        if(now == 1) {printf("%.9lf", f[1] / (1 - p[1])); return 0;}
        FOR(j, 1, n - 1)
        {
            f[j] += f[now] / (1 - p[now]) * a[j][now] * p[j];
            p[j] *= 1.0 - a[j][now];
        }
    }
    return 0;
}
posted @ 2022-08-14 21:10  zuytong  阅读(37)  评论(0编辑  收藏  举报