[luoguP3317] [SDOI2014]重建(矩阵树定理)
Posted 蒟蒻zht的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[luoguP3317] [SDOI2014]重建(矩阵树定理)相关的知识,希望对你有一定的参考价值。
为了搞这个题又是学行列式,又是学基尔霍夫矩阵。
无耻地直接发链接,反正我也是抄的题解。。
#include <cstdio> #include <cmath> #include <iostream> using namespace std; int n; double a[101][101]; double ans = 1, tmp = 1, eps = 1e-9; inline void gs() { int i, j, k; double div; for(j = 1; j < n; j++) { k = j; for(i = j + 1; i < n; i++) if(fabs(a[i][j]) > fabs(a[k][j])) k = i; if(j != k) swap(a[j], a[k]); if(fabs(a[j][j]) < eps) { ans = 0; return; } for(i = j + 1; i < n; i++) { div = a[i][j] / a[j][j]; for(k = j; k < n; k++) a[i][k] -= a[j][k] * div; } } for(i = 1; i < n; i++) ans *= a[i][i]; ans = fabs(ans); } int main() { int i, j; scanf("%d", &n); for(i = 1; i <= n; i++) for(j = 1; j <= n; j++) { scanf("%lf", &a[i][j]); if(fabs(a[i][j]) < eps) a[i][j] = eps; if(fabs(1 - a[i][j]) < eps) a[i][j] = 1 - eps; if(i < j) tmp *= 1.0 - a[i][j]; a[i][j] /= 1.0 - a[i][j]; } for(i = 1; i <= n; i++) { a[i][i] = 0; for(j = 1; j <= n; j++) if(i != j) { a[i][i] += a[i][j]; a[i][j] = -a[i][j]; } } gs(); printf("%.5lf\\n", ans * tmp); return 0; }
以上是关于[luoguP3317] [SDOI2014]重建(矩阵树定理)的主要内容,如果未能解决你的问题,请参考以下文章