CF605E Intergalaxy Trips

https://www.luogu.com.cn/problem/CF605E

首先肯定对E排序
在这里插入图片描述
式子推出来这样
然后类似dijkstra一样转移即可

有1点阴间

code;

#include<bits/stdc++.h>
#define N 2050
using namespace std;
int n, vis[N];
double p[N][N], prod[N], E[N];
int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i ++) 
        for(int j = 1; j <= n; j ++) {
            int x;
            scanf("%d", &x);
            p[i][j] = 1.0 * x / 100.0;
        }
    
    for(int i = 1; i < n; i ++) prod[i] = 1.0 - p[i][n], E[i] = 1;
    vis[n] = 1;
  //  for(int i = 1; i <= n; i ++) printf("%.3lf ", prod[i]); printf("\n");
    for(int i = 1; i <= n; i ++) {
        int u = 0;
        double mi = 1e18;
        for(int j = 1; j <= n; j ++) if(!vis[j] && E[j] / (1.0 - prod[j]) < mi) u = j, mi = E[j] / (1.0 - prod[j]);
        E[u] = E[u] / (1.0 - prod[u]);
        vis[u] = 1;
       // printf("  %d  %lf   %lf\n", u, E[u], prod[u]);
        for(int v = 1; v <= n; v ++) if(!vis[v])
            E[v] += E[u] * p[v][u] * prod[v], prod[v] *= 1.0 - p[v][u];
    }
    printf("%.9lf", E[1]);

    return 0;
}
posted @ 2021-12-10 11:19  lahlah  阅读(27)  评论(0编辑  收藏  举报