题解:
如果知道最终的大小关系就比较好做。
不过我们发现最后如果确定了大小关系,那么大的只会从小的转移过来。那么我们现在从小到大逐个确定就好了。
#include <bits/stdc++.h>
using namespace std;
typedef double LD;
const int N=1e3+50;
int n,vis[N]; LD G[N][N],pre[N],sum[N];
inline int rd(int x=0) {return (cin>>x,x);}
int main() {
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
G[i][j]=rd()/100.;
vis[n]=1; if(n==1) {puts("0"); return 0;}
for(int i=1;i<n;i++)
pre[i]=(1.0-G[i][n]), sum[i]=1.;
for(int i=2;i<=n;i++) {
LD mn=1e99; int mnid=0;
for(int j=1;j<=n;j++) if(!vis[j]) {
LD t=sum[j]/(1.0-pre[j]);
if(t<mn) mn=t, mnid=j;
} vis[mnid]=1;
if(mnid==1) return printf("%.15f\n",(double)mn),0;
for(int j=1;j<=n;j++) if(!vis[j]) {
sum[j]+=pre[j]*G[j][mnid]*mn;
pre[j]=pre[j]*(1.-G[j][mnid]);
}
}
}