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/ +
+++++++++++++++++++++++++++++++++++++++++++