【BZOJ3534】重建(矩阵树定理)

【BZOJ3534】重建(矩阵树定理)

题面

BZOJ
洛谷

题解

这。。。。
矩阵树定理神仙用法????

#include<iostream>
#include<cmath>
using namespace std;
#define ll long long
#define eps 1e-8
int n;
double g[55][55],s=1;
double Gauss()
{
	double ret=1;
	for(int i=1;i<n;++i)
	{
		int nw=i;
		for(int j=i+1;j<n;++j)if(fabs(g[j][i])>fabs(g[nw][i]))nw=j;
		swap(g[nw],g[i]);
		for(int j=i+1;j<n;++j)
		{
			double t=g[j][i]/g[i][i];
			for(int k=i;k<n;++k)g[j][k]-=t*g[i][k];
		}
		ret*=g[i][i];
	}
	return fabs(ret);
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>n;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
		{
			cin>>g[i][j];
			if(g[i][j]<eps)g[i][j]=eps;
			if(g[i][j]>1-eps)g[i][j]=1-eps;
			if(i<j)s*=1-g[i][j];
			g[i][j]/=1-g[i][j];
		}
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			if(i!=j)g[i][i]-=g[i][j];
	printf("%.8lf\n",Gauss()*s);
}

posted @ 2018-08-07 21:43  小蒟蒻yyb  阅读(311)  评论(0编辑  收藏  举报