首页 > 其他 > 详细

[SDOI2014] 重建 - 矩阵树定理,概率期望

时间:2020-01-31 16:31:38      阅读:63      评论:0      收藏:0      [点我收藏+]

技术分享图片

#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\n",ans);
}

[SDOI2014] 重建 - 矩阵树定理,概率期望

原文:https://www.cnblogs.com/mollnn/p/12245705.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!