[http://blog.csdn.net/u013654696/article/details/51932347]
dp[i]从i到n 的最少时间
如果i可以到达j,但是dp[j]>dp[i]我们肯定宁愿等着,也不会去j,
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int N=1100;
const double INF=1e20;
const double eps=1e-12;
int sig(double a){
if(fabs(a)<eps)return 0;
if(a<0)return -1;
else return 1;
}
double A[N],B[N],dis[N];
int vis[N];
double p[N][N];
int main(){
#ifdef DouBi
freopen("in.cpp","r",stdin);
#endif // DouBi
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%lf",&p[i][j]);
p[i][j]/=100;
}
}
for(int i=0;i<n;i++){
A[i]=B[i]=1,dis[i]=INF;
}
memset(vis,0,sizeof(vis));
dis[n-1]=0;
for(int i=0;i<n;i++){
double tmp=1e10;int id=-1;
for(int j=0;j<n;j++)if(!vis[j]&&dis[j]<tmp){
tmp=dis[j],id=j;
}
if(id==-1)break;
vis[id]=1;
//printf("%d %lf\n",id,dis[id]);
for(int j=0;j<n;j++)if(!vis[j]){
B[j]+=A[j]*p[j][id]*dis[id];
A[j]*=(1-p[j][id]);
}
for(int j=0;j<n;j++)if(!vis[j]){
//printf("%dj %lf\n",j,A[j]);
if(sig(1-A[j])==0)continue;
dis[j]=B[j]/(1-A[j]);
}
}
printf("%.10lf\n",dis[0]);
}
return 0;
}