关怀他人
2021-01-27 23:14:34
设
所以我们永远不会走到一个比当前期望步数大的点,所以我们可以考虑将所有答案按从小到大的顺序算出,并以此扩展。
设
后面的
用类似
时间复杂度
int n;
int vis[MAXN],a[MAXN];
double p[MAXN][MAXN],E[MAXN],prod[MAXN];
int main(){
scanf("%d",&n);
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
scanf("%lf",&p[i][j]), p[i][j] /= 100;
if(n == 1) {printf("0\n"); return 0;}
for(int i = 1;i <= n;i++) E[i] = 1, prod[i] = 1 - p[i][n];
vis[n] = 1; a[1] = n;
for(int i = 1;i <= n;i++){
double minval = llINF; int pos = 0;
for(int j = 1;j <= n;j++){
if(!vis[j] && E[j] / (1 - prod[j]) < minval){
pos = j;
minval = E[j] / (1 - prod[j]);
}
}
vis[pos] = 1;
for(int j = 1;j <= n;j++)
E[j] += E[pos] / (1 - prod[pos]) * p[j][pos] * prod[j], prod[j] *= (1 - p[j][pos]);
}
printf("%.8f\n",E[1] / (1 - prod[1]));
return 0;
}