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;
}