BZOJ 3534 [Sdoi2014]重建

题解:矩阵树定理

邻接矩阵-度数矩阵(期望下)

求出来的行列式为所有(生成树边权乘积)的和

每条边边权化为 c/(1-c),最后乘上π(1-c),对1边权特殊处理一下

问题:矩阵树定理不熟,不会证明

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=60;
const double eps=1e-9;

double tmp=1;

inline int dcmp(double x){
	if(fabs(x)<eps)return 0;
	if(x>0)return 1;
	else return -1;
}
int n;

double A[maxn][maxn];
double G[maxn][maxn];

double Gauss(){
	--n;
	for(int j=1;j<=n;++j){
		int maxline=j;
		for(int i=j+1;i<=n;++i){
			if(fabs(A[i][j])>fabs(A[maxline][j]))maxline=i;
		}
		if(dcmp(A[maxline][j])==0)return 0.0;
		if(maxline!=j)for(int i=j;i<=n;++i)swap(A[j][i],A[maxline][i]);
		for(int i=j+1;i<=n;++i){
			for(int k=j+1;k<=n;++k){
				A[i][k]-=A[i][j]*A[j][k]/A[j][j];
			}
			A[i][j]=0;
		}
	}
	double ret=1;
	for(int i=1;i<=n;++i)ret*=A[i][i];
	return ret*tmp;
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		for(int j=1;j<=n;++j){
			scanf("%lf",&G[i][j]);
			if(dcmp(G[i][j]-1)==0)G[i][j]-=eps;
			if(i<j)tmp*=(1-G[i][j]);
			G[i][j]/=(1-G[i][j]);
		}
	}
	for(int i=1;i<=n;++i){
		double sum=0;
		for(int j=1;j<=n;++j){
			A[i][j]=G[i][j];sum+=A[i][j];
		}
//		A[i][i]=-sum;
		A[i][i]=-sum;
	}
	printf("%.9f\n",fabs(Gauss()));
	return 0;
}

  

原文地址:https://www.cnblogs.com/zzyer/p/8456389.html

时间: 2024-11-05 21:48:19

BZOJ 3534 [Sdoi2014]重建的相关文章

[SDOI2014]重建

P3317 [SDOI2014]重建 题解 直接M-T肯定不对 推出的是对于所有树的生成概率的和,可以考虑行列式的期望,再交换求和号即可 同时乘上π(1-P)再变化初始的概率就有点厉害了 一种变化的技巧 代码: #include<bits/stdc++.h> #define il inline #define reg register int #define numb (ch^'0') #define ld long double using namespace std; typedef lo

BZOJ 3534 重建

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3534 题意:给定一个无向图,每条边有选择概率P:求选出的边恰是一棵生成树的概率. 首先,将A[i][j]从01变成这条边的概率,然后a[i][i]减去每条有i的边的概率,对此求n-1阶主子式的行列式, 可以得到:Σ(p[i]*p[i+1]*p[i+2]*...p[n-1])(p代表某棵树的集合中,这个集合里每条边选中的概率) 可是,这个概率只与树边有关,却无法保证没有非树边 我们重新考虑

bzoj 2957: 楼房重建.

2957: 楼房重建 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2303  Solved: 1088[Submit][Status][Discuss] Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个二维平面上.小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和

[BZOJ 3531] [Sdoi2014] 旅行 【离线+LCT】

题目链接:BZOJ - 3531 题目分析 题目询问一条路径上的信息时,每次询问有某种特定的文化的点. 每个点的文化就相当于一种颜色,每次询问一条路径上某种颜色的点的信息. 可以使用离线算法, 类似于“郁闷的小 J ” 那道题目.将各种操作和询问按照颜色为第一关键字,时间为第二关键字排序. 那么修改颜色的操作就相当于在原颜色中是删点,在新颜色中是加点. 处理完一种颜色的操作后,要将这个颜色的点都做一次删除操作,这样,对于处理下一种颜色,树就又是空的了. 这种题,思考的时候有点晕,写代码的时候非常

bzoj 3531 [Sdoi2014]旅行(树链剖分,线段树)

3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 876  Solved: 446[Submit][Status][Discuss] Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们用不同的正整数代表 各种宗教,  S国的居民常常旅行.旅行时他们总

BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]

3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1399  Solved: 694[Submit][Status][Discuss] Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a的数之和. Input 输入包含多组数据.    输入的第一行一个整数Q表示测试点内的数据

bzoj 2957: 楼房重建 线段树

2957: 楼房重建 Time Limit: 10 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个二维平面上.小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度.

BZOJ 2597 楼房重建 分块

题目大意:给定n座楼,初始高度为0,每次可以改变某栋楼的高度,求每次改变高度之后从原点可以看到几栋楼 记录每栋楼楼顶与原点连线的斜率 那么一栋楼可见当且仅当前面所有楼的斜率都小于这栋楼 将n栋楼分为√(0.5*n*logn)块 每一块内维护一个单调上升子序列(注意不是LCS) 比如说4 1 2 3 5 那么维护的序列就是4 5 修改的时候块内暴力重建 然后查询顺着块撸一遍 每次记录当前的最大值 然后去下一个块中二分找到第一个比这个最大值大的值 然后统计答案&&更新最大值 #include

[BZOJ 3530] [Sdoi2014] 数数 【AC自动机+DP】

题目链接:BZOJ - 3530 题目分析 明显是 AC自动机+DP,外加数位统计. WZY 神犇出的良心省选题,然而去年我太弱..比现在还要弱得多.. 其实现在做这道题,我自己也没想出完整解法.. 就想出了个 O(l^3) 的做法: 完全按照数位统计的思想来,先统计长度不足 len 的数字的合法种类数,这个枚举开头,然后 AC 自动机 DP 一下,用 f[i][j] 表示到了第 i 位,在第 j 个节点上的合法数字个数.这样是 O(L^2). 然后长度等于 n 的部分,就按照数位统计,一位位向