zoukankan      html  css  js  c++  java
  • P3317 [SDOI2014]重建

    传送门

    变元矩阵树定理:求所有生成树的总边积的和,行列式中 $A[i][i]$ 为总边权和,$A[i][j]$ 为 $i,j$ 之间边权相反数

    这题显然考虑这个东西

    但是不能直接把边权变成概率,还要考虑非树边出现的概率

    就是说原本矩阵树可以求 $sum _{Tree}prod _{ein Tree}P[e]$

    但是此题要求的是 $sum _{Tree}prod _{ein Tree}P[e]prod _{e otin Tree}(1-P[e])$

    考虑化一下上面那个式子:

       $sum _{Tree}prod _{ein Tree}P[e]prod _{e otin Tree}(1-P[e])$

    $=sum _{Tree}prod _{ein Tree}P[e]frac{prod _{e}(1-P[e])}{prod _{ein Tree}(1-P[e])}$

    $=prod _{e}(1-P[e])sum _{Tree}prod _{ein Tree}frac{P[e]}{(1-P[e])}$

    然后就可以矩阵树了

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    typedef double db;
    inline int read()
    {
        int x=0,f=1; char ch=getchar();
        while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
        while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
        return x*f;
    }
    const int N=107;
    const db eps=1e-7;
    int n;
    db A[N][N],ans=1;
    db Gauss()
    {
        db res=1.0;
        for(int i=1;i<n;i++)
        {
            int tmp=i;
            for(int j=i+1;j<n;j++)
                if(fabs(A[tmp][i])<fabs(A[j][i])) tmp=j;
            if(tmp!=i) swap(A[tmp],A[i]),res=-res;
            for(int j=i+1;j<n;j++)
            {
                db t=A[j][i]/A[i][i];
                for(int k=i;k<n;k++) A[j][k]-=t*A[i][k];
            }
            res*=A[i][i];
        }
        return fabs(res);
    }
    int main()
    {
        n=read();
        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++)
            {
                db t= (1.0-A[i][j])<eps ? eps : 1.0-A[i][j];//防止分母为0
                A[i][j]/=t; if(i<j) ans*=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]*=-1;
        printf("%.10lf",ans*Gauss());
        return 0;
    }
  • 相关阅读:
    微信java封装
    解决PowerDesigner 生成Sql2005-2012 找不到sysproperties表的问题
    ASP.net解析JSON例子
    c# 遍历子控件,比如Form下的group,或者panel
    修改sql2005字段
    清除grid内容的列
    sql 2000以及2005以上获取数据库中所有的表(不包括系统表)
    获取SqlServer2005表结构(字段,主键,外键,递增,描述)
    SQL SERVER 数据库实用SQL语句
    查找所有页面中的按钮
  • 原文地址:https://www.cnblogs.com/LLTYYC/p/10627813.html
Copyright © 2011-2022 走看看