当前位置: 首页 > news >正文

[bzoj 3534][Sdoi2014] 重建

传送门

Description

 T国有N个城市,用若干双向道路连接。一对城市之间至多存在一条道路。

在一次洪水之后,一些道路受损无法通行。虽然已经有人开始调查道路的损毁情况,但直到现在几乎没有消息传回。

幸运的是,此前T国政府调查过每条道路的强度,现在他们希望只利用这些信息估计灾情。具体地,给定每条道路在洪水后仍能通行的概率,请计算仍能通行的道路恰有N-1条,且能联通所有城市的概率。

Solution

给出每条边出现的概率,求生成一棵树的概率。

首先要知道矩阵树定理和变元矩阵树定理。。。

对于一个无向图G,它的生成树个数等于其基尔霍夫Kirchhoff矩阵任何一个N-1阶主子式的行列式的绝对值

基尔霍夫Kirchhoff矩阵 K =度数矩阵 D - 邻接矩阵 A

这里邻接矩阵可以有不同形式

  • 如果\(A[i][j]\)表示i\(i\)\(j\)之间边的数量,则\(det\)等于生成树的数量
  • 如果\(A[i][j]\)表示\(i\)\(j\)之间边的长度,则\(det=\sum_{T} \prod T_{e_i}\),也就是每个生成树的边权积之和

怎么求行列式?

讲得很浅显的博客

这里有几个性质:

  • 交换两行(列),行列式变号
  • 加上另外一行的\(k\)倍,行列式不变

所以用高斯消元,把它变成一个上三角矩阵,那么它的行列式就是对角线的乘积啦


Code 

#include <bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(x) (x>0?x:-x)
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<<3)+(x<<1)+ch-'0';ch=getchar();}
}
#define eps (1e-8)
int n;
double ans=1.,a[55][55];

double Gauss()
{
    double ret=1.;
    register int i,j,k;
    for(i=1;i<n;++i)
    {    
        //for(j=i+1;j<n;++j)
        //    if(abs(a[j][i])>abs(a[i][i])) std::swap(a[j],a[i]),ret=-ret;
        for(j=i+1;j<n;++j)
        {
            double t=a[j][i]/a[i][i];
            for(k=i;k<n;++k) a[j][k]-=t*a[i][k];
        }
        ret*=a[i][i];
    }
    return abs(ret);
}

int main()
{
    scanf("%d",&n);
    register int i,j;
    for(i=1;i<=n;++i)for(j=1;j<=n;++j)
    {
        scanf("%lf",&a[i][j]);
        double t=fabs(1.-a[i][j])<eps?eps:(1.-a[i][j]);
        if(i<j) ans*=t;
        a[i][j]=a[i][j]/t;
    }
    for(i=1;i<=n;++i)for(j=1;j<=n;++j)
        if(i!=j) a[i][i]+=a[i][j],a[i][j]=-a[i][j];
    printf("%.10lf\n",Gauss()*ans);
    return 0;
}



Blog来自PaperCloud,未经允许,请勿转载,TKS!

转载于:https://www.cnblogs.com/PaperCloud/p/10214423.html

相关文章:

  • 第13周Python学习周记
  • SpringBoot 项目中使用velocity模板(转载)
  • 从房地产住宅销售面积增速看房地产行业
  • Android 7.0 中 ContentProvider 实现原理
  • 说说 Vue.js 中的自定义指令
  • mygenerator().next() AttributeError: 'generator' object has no attribute 'next'
  • 使用 ESLint + Prettier 美化代码
  • django进阶
  • 当安装、卸载件包时,出现依赖问题 error: Failed dependencies解决办法
  • vue.js实现单个页面操作之学习案例笔记
  • 盘点抖音源码中的广告变现方式
  • 搭建appium的android环境
  • six.moves的用法
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • Kotlin的LogUtil
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 〔开发系列〕一次关于小程序开发的深度总结
  • CSS 专业技巧
  • Django 博客开发教程 16 - 统计文章阅读量
  • HashMap剖析之内部结构
  • Java深入 - 深入理解Java集合
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • markdown编辑器简评
  • MaxCompute访问TableStore(OTS) 数据
  • node学习系列之简单文件上传
  • php面试题 汇集2
  • Promise面试题2实现异步串行执行
  • Python十分钟制作属于你自己的个性logo
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • 安卓应用性能调试和优化经验分享
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 技术:超级实用的电脑小技巧
  • 前端存储 - localStorage
  • 强力优化Rancher k8s中国区的使用体验
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 三栏布局总结
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 问题之ssh中Host key verification failed的解决
  • 我这样减少了26.5M Java内存!
  • 小而合理的前端理论:rscss和rsjs
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • $L^p$ 调和函数恒为零
  • (1)虚拟机的安装与使用,linux系统安装
  • (C语言)球球大作战
  • (day 12)JavaScript学习笔记(数组3)
  • (poj1.2.1)1970(筛选法模拟)
  • (笔试题)合法字符串
  • (二)windows配置JDK环境
  • (二十三)Flask之高频面试点
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (三)mysql_MYSQL(三)
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (原創) 如何將struct塞進vector? (C/C++) (STL)