1. 程式人生 > >矩陣樹定理--luogu P3317 [SDOI2014]重建

矩陣樹定理--luogu P3317 [SDOI2014]重建

傳送門

好吧在 M o n s t e r _ Q i

Monster\_Qi 的強烈要(bi)求(po)下,這篇文章轉自他的部落格

我就不寫了

只好放上我優秀的程式碼:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define N 55
using namespace std;

int n;
double a[N][N],ans=
1.0; const double eps=1e-6; inline double Matrix_tree(){ double res=1.0; for(int i=1;i<n;i++){ for(int j=i+1;j<n;j++){ int p=i; if(fabs(a[j][i])>fabs(a[p][i])) p=j; if(p!=i) swap(a[p],a[i]),res=-res; } if(fabs(a[i][i])<eps) return 0.0; for(int j=i+1;j<n;j++){ double
rate=a[j][i]/a[i][i]; for(int k=i;k<n;k++) a[j][k]-=rate*a[i][k]; } res*=a[i][i]; } return fabs(res); } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%lf",&a[i][j]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ double t=fabs(1.0-a[i][j])<eps?eps:(1.0-a[i][j]); if(i<j) ans*=t; a[i][j]=a[i][j]/t; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(i!=j) a[i][i]+=a[i][j],a[i][j]=-a[i][j]; ans*=Matrix_tree(); printf("%.4lf\n",ans); return 0; }