直接M-T肯定不对
推出的是对于所有树的生成概率的和,可以考虑行列式的期望,再交换求和号即可
同时乘上π(1-P)再变化初始的概率就有点厉害了
一种变化的技巧
代码:
#include#define il inline#define reg register int#define numb (ch^'0')#define ld long doubleusing namespace std;typedef long long ll;il void rd(int &x){ char ch;bool fl=false; while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true); for(x=numb;isdigit(ch=getchar());x=x*10+numb); (fl==true)&&(x=-x);}namespace Miracle{const int N=55;const double eps=1e-8;ld G[N][N],f[N][N];int n;ld GUASS(int n){ for(reg i=1;i<=n;++i){ int id=0; for(reg j=i;j<=n;++j){ if(fabs(f[j][i])>fabs(f[id][i])) id=j; } if(id!=i){ for(reg j=i;j<=n;++j){ swap(f[i][j],f[id][j]); } } for(reg k=i+1;k<=n;++k){ if(fabs(f[k][i])>eps){ ld tmp=f[k][i]/f[i][i]; for(reg j=i;j<=n;++j){ f[k][j]-=f[i][j]*tmp; } } } } ld ret=1.00; for(reg i=1;i<=n;++i){ ret=ret*f[i][i]; } return ret;}int main(){ rd(n); ld tmp=1.00; for(reg i=1;i<=n;++i) { for(reg j=1;j<=n;++j){ scanf("%Lf",&G[i][j]); if(fabs(G[i][j])