[SDOI2014] 重建

#include <bits/stdc++.h>
#define eps 1e-6
using namespace std;

const int N = 55;

namespace mat {
double a[N][N];
int n,p=1;

double gauss_jordan() {
    double ans = 1;
	for(int i=1;i<=n;i++) {
		int r=i;
		for(int j=i+1;j<=n;j++) if(fabs(a[j][i])>fabs(a[r][i])) r=j;
		if(r-i) {for(int j=1;j<=n+1;j++) swap(a[i][j],a[r][j]); ans*=-1;}
		//if(fabs(a[i][i])<eps) {p=0; return;}
		for(int j=1;j<=n;j++) if(j-i) {
			double tmp=a[j][i]/a[i][i];
			for(int k=i+1;k<=n+1;k++) a[j][k]-=a[i][k]*tmp;
		}
		ans*=a[i][i];
	}
	return ans;
}
} // namespace mat

double n,p[N][N];

int main() {
    cin>>n;
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=n;j++) {
            cin>>p[i][j];
            if(abs(1-p[i][j])<eps) p[i][j]-=eps;
        }
    }
    double ans=1;
    for(int i=1;i<=n;i++) {
        for(int j=i+1;j<=n;j++) {
            ans*=1-p[i][j];
        }
    }
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=n;j++) if(i!=j) {
            mat::a[i][j]=-p[i][j]/(1-p[i][j]);
            mat::a[i][i]+=p[i][j]/(1-p[i][j]);
        }
    }
    mat::n=n-1;
    ans*=mat::gauss_jordan();
    printf("%.8lf
",ans);
}
原文地址:https://www.cnblogs.com/mollnn/p/12245705.html