当前位置: 首页 > 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
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • HashMap ConcurrentHashMap
  • Idea+maven+scala构建包并在spark on yarn 运行
  • js面向对象
  • Laravel 菜鸟晋级之路
  • magento 货币换算
  • Mysql数据库的条件查询语句
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 基于web的全景—— Pannellum小试
  • 利用DataURL技术在网页上显示图片
  • 前端代码风格自动化系列(二)之Commitlint
  • 前端攻城师
  • 如何设计一个比特币钱包服务
  • 如何胜任知名企业的商业数据分析师?
  • 如何使用 JavaScript 解析 URL
  • 世界上最简单的无等待算法(getAndIncrement)
  • 小程序button引导用户授权
  • 协程
  • 应用生命周期终极 DevOps 工具包
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • #NOIP 2014# day.1 T2 联合权值
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (bean配置类的注解开发)学习Spring的第十三天
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (ros//EnvironmentVariables)ros环境变量
  • (超详细)语音信号处理之特征提取
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (五)Python 垃圾回收机制
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • *1 计算机基础和操作系统基础及几大协议
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net core 6 redis操作类
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .Net MVC4 上传大文件,并保存表单
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】