p3317 [SDOI2014]重建
分析
代码
#include<bits/stdc++.h>
using namespace std;
#define lb double
const lb eps = 1e-8;
lb g[110][110],res=1.0;
int n;
inline lb gs(){
int i,j,k;
lb ans=1.0;
for(i=1;i<=n;i++){
int mx=i;
for(j=1;j<=n;j++)
if(g[mx][i]<g[j][i])mx=j;
if(mx!=i)ans=-ans,swap(g[i],g[mx]);
if(fabs(g[i][i])<eps)return 0.0;
for(j=i+1;j<=n;j++){
lb t=g[j][i]/g[i][i];
for(k=i;k<=n;k++)
g[j][k]-=t*g[i][k];
}
ans*=g[i][i];
}
return ans;
}
int main(){
int i,j,k;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%lf",&g[i][j]);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
if(fabs(g[i][j])<eps)g[i][j]=eps;
if(fabs(1.0-g[i][j])<eps)g[i][j]=1.0-eps;
if(j>i)res*=(1.0-g[i][j]);
g[i][j]=g[i][j]/(1.0-g[i][j]);
}
for(i=1;i<=n;i++){
g[i][j]=0.0;
for(j=1;j<=n;j++)
if(i!=j)g[i][i]+=g[i][j],g[i][j]=-g[i][j];
}
n--;
printf("%0.6lf\n",res*gs());
return 0;
}