设
F
[
i
]
F[i]
F[i]表示从
i
i
i号点出发到
n
n
n号点最小期望时间。类似dijkstra算法,按
F
F
F值从小往大确定每个点的最小期望时间并更新即可。
时间复杂度
O
(
n
2
)
\mathcal O(n^2)
O(n2)。
#include <bits/stdc++.h>
#define eps 1e-8
using namespace std;
typedef double db;
int num[1005][1005];
db f[1005],val[1005];
bool vis[1005];
db solve(int n) {
for(int i=1;i<n;i++) val[i]=1.0;
for(int i=1;i<=n;i++) {
int id=0;
for(int j=1;j<=n;j++)
if (!vis[j]&&fabs(1.0-val[j])>eps) {
if (!id||(f[j]+1.0)*(1.0-val[id])<(f[id]+1.0)*(1.0-val[j])) id=j;
}
vis[id]=1;
if (id<n) f[id]=(f[id]+1.0)/(1.0-val[id]);
if (id==1) return f[1];
for(int j=1;j<=n;j++)
if (!vis[j]) {
f[j]+=val[j]*num[j][id]/100.0*f[id];
val[j]*=(100.0-num[j][id])/100.0;
}
}
}
int main() {
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) scanf("%d",&num[i][j]);
printf("%.10f\n",solve(n));
return 0;
}