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;
}

 

posted @ 2019-09-19 09:57  水题收割者  阅读(154)  评论(0编辑  收藏  举报