BZOJ3534:[SDOI2014]重建——题解

https://www.lydsy.com/JudgeOnline/problem.php?id=3534

https://www.luogu.org/problemnew/show/P3317

T国有N个城市,用若干双向道路连接。一对城市之间至多存在一条道路。
在一次洪水之后,一些道路受损无法通行。虽然已经有人开始调查道路的损毁情况,但直到现在几乎没有消息传回。
辛运的是,此前T国政府调查过每条道路的强度,现在他们希望只利用这些信息估计灾情。具体地,给定每条道路在洪水后仍能通行的概率,请计算仍能通行的道路恰有N-1条,且能联通所有城市的概率。

https://stone41123.blog.luogu.org/solution-p3317吧……

我也没啥好讲的了。

#include<cstdio>
#include<queue>
#include<cstring>
#include<cmath>
#include<cctype>
#include<algorithm>
using namespace std;
typedef double dl;
const dl eps=1e-10;
const int N=51;
dl x[N][N],ans=1;
dl gauss(int n){
    dl res=1;
    for(int i=1;i<=n;i++){
        int l=i;
        for(int j=i+1;j<=n;j++){
            if(fabs(x[l][i])<fabs(x[j][i]))l=j;
        }
        if(l!=i){
            for(int j=i;j<=n;j++)
                swap(x[i][j],x[l][j]);
        res=-res;
        }
        for(int j=i+1;j<=n;j++){
            dl t=x[j][i]/x[i][i];
            for(int k=i;k<=n;k++)
                x[j][k]-=t*x[i][k];
        }
    if(fabs(x[i][i])<eps)return 0;
    }
    for(int i=1;i<=n;i++)res*=x[i][i];
    return res;
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
    for(int j=1;j<=n;j++){
        scanf("%lf",&x[i][j]);
        if(fabs(x[i][j])<eps)x[i][j]=eps;
        if(fabs(1-x[i][j])<eps)x[i][j]=1-eps;
        if(i<j)ans*=1-x[i][j];
        x[i][j]/=1-x[i][j];
    }
    }
    for(int i=1;i<=n;i++){
    x[i][i]=0;
    for(int j=1;j<=n;j++){
        if(i!=j)
        x[i][i]-=x[i][j];
    }
    }
    ans*=gauss(n-1);
    printf("%.10lf\n",fabs(ans));
    return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/ +

+++++++++++++++++++++++++++++++++++++++++++

posted @ 2018-05-02 19:44  luyouqi233  阅读(232)  评论(0编辑  收藏  举报