zoukankan      html  css  js  c++  java
  • BZOJ 3534: [Sdoi2014]重建(Matrix Tree)

    传送门

    解题思路

      比较容易看的出来矩阵树定理。然后就怒送一Wa,这个矩阵树定理是不能直接用的。题目要求的其实是这个玩意。

    [ans=sumlimits_{Tree}( prodlimits_{ein Tree}p_e*prodlimits_{e otin Tree}(1-p_e)) ]

    而矩阵树能求的东西本质上其实是每棵生成树的积的和,说人话就是这个。

    [now=sumlimits_{Tree}prodlimits_{ein Tree}w_e ]

    这个形式跟上面那个很像,但还是有点不一样。我们考虑将上面那个式子化简。根据

    [prodlimits_{e otin Tree}(1-p_e)=frac{prodlimits_e (1-p_e)}{prodlimits_{ein Tree}(1-p_e)} ]

    把这玩意往最上面那个式子里一带,神奇的事情发生了:

    [ans=prodlimits_e(1-p_e)*sumlimits_{Tree} frac{prodlimits_{ein Tree}p_e}{prodlimits_{ein Tree}(1-p_e)} ]

    前面这个玩意可以直接算出来。后头这个玩意直接上矩阵树,把邻接矩阵的边权改成(frac{p_e}{1-p_e})就行了。

    通过这道题,让我们明白了原来矩阵树里的那个边权是可以自己规定的,算出来的结果为每个生成树的积之和。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    
    using namespace std;
    const int MAXN = 55;
    const double eps = 1e-8;
    
    int n;
    double ans=1.0,base=1.0,f[MAXN][MAXN];
    
    inline void Matrix_tree(){
    	double t;int p;
    	for(int i=1;i<n;i++){
    		p=i;
    		for(int j=i+1;j<n;j++)
    			if(fabs(f[p][i])<fabs(f[j][i])) p=j;
    		if(p!=i) swap(f[i],f[p]);
    		for(int j=i+1;j<n;j++){
    			t=f[j][i]/f[i][i];
    			for(int k=i;k<n;k++) 
    				f[j][k]-=t*f[i][k];
    		}
    		ans*=f[i][i];
    	}
    }
    
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++){
    			scanf("%lf",&f[i][j]);if(i==j) continue;
    			if(f[i][j]>1.0-eps) f[i][j]-=eps;
    			if(i>j && f[i][j]>eps) base*=(1-f[i][j]);
    			f[i][j]=f[i][j]/(1-f[i][j]);
    		}
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)if(i!=j)
    			f[i][i]+=f[i][j],f[i][j]=-f[i][j];
    	Matrix_tree();printf("%.10lf",ans*base);
    	return 0;
    }
    
  • 相关阅读:
    标签的讲解
    属性分类
    LeetCode 003. 无重复字符的最长子串 双指针
    Leetcode 136. 只出现一次的数字 异或性质
    Leetcode 231. 2的幂 数学
    LeetCode 21. 合并两个有序链表
    象棋博弈资源
    acwing 343. 排序 topsort floyd 传播闭包
    Leetcode 945 使数组唯一的最小增量 贪心
    Leetcode 785 判断二分图 BFS 二分染色
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/10045819.html
Copyright © 2011-2022 走看看