题目大意:求生成树概率,边权为实数
题解:emmm
膜xehoth
我的收获:强啊
#include<cstdio>
#include<cmath>
#include<algorithm>
#define N 52
using namespace std;
namespace runzhe2000
{
const double eps = 1e-7;
int n;
double f[N][N], pro = 1;
double Gauss()
{
double det = 1;
for(int i = 1; i < n; i++)
{
/*↓↓↓把绝对值最大的一行换上来↓↓↓*/
int r = i;
for(int j = i; j < n; j++)
if(fabs(f[j][i]) > fabs(f[r][i])) r = j;
if(r != i) for(int j = 1; j < n; j++) swap(f[i][j], f[r][j]);
/*↑↑↑要不然我也不知道为什么会被卡精度↑↑↑*/
if(-eps < f[i][i] && f[i][i] < eps) return 0;
for(int j = i+1; j < n; j++)
{
double tmp = -f[j][i]/f[i][i];
for(int k = i; k <= n; k++)
f[j][k] += tmp * f[i][k];
}
det *= f[i][i];
}
return det < 0 ? -det : det;
}
void main()
{
scanf("%d",&n);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
{
scanf("%lf",&f[i][j]);
if(f[i][j] > 1-eps) f[i][j] -= eps;
if(i < j)pro *= (1-f[i][j]);
f[i][j] /= (1-f[i][j]);
}
for(int i = 1; i <= n; i++)
{
double sum = 0;
for(int j = 1; j <= n; j++) sum += f[i][j];
f[i][i] = -sum;
}
printf("%.8lf\n",Gauss() * pro);
}
}
int main()
{
runzhe2000::main();
}