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

    题目描述

    T国有N个城市,用若干双向道路连接。一对城市之间至多存在一条道路。 在一次洪水之后,一些道路受损无法通行。虽然已经有人开始调查道路的损毁情况,但直到现在几乎没有消息传回。 辛运的是,此前T国政府调查过每条道路的强度,现在他们希望只利用这些信息估计灾情。具体地,给定每条道路在洪水后仍能通行的概率,请计算仍能通行的道路恰有N-1条,且能联通所有城市的概率。

    输入输出格式

    输入格式:

    输入的第一行包含整数N。 接下来N行,每行N个实数,第i+l行,列的数G[i][j]表示城市i与j之间仍有道路联通的概率。 输入保证G[i][j]=G[j][i],且G[i][j]=0;G[i][j]至多包含两位小数。

    输出格式:

    输出一个任意位数的实数表示答案。 你的答案与标准答案相对误差不超过10^(-4)即视为正确。

    输入输出样例

    输入样例#1: 
    3
    0 0.5 0.5
    0.5 0 0.5
    0.5 0.5 0
    输出样例#1: 
    0.375

    说明

    1 < N < =50

    数据保证答案非零时,答案不小于10^-4

        我们来考虑一下一个 度数矩阵-邻接矩阵 的行列式的意义,就是所有该邻接矩阵代表的图的所有生成树的边权之积的和。

    而我们要求的是所有生成树中树边概率之积再乘上非树边(1-其概率)之积 的和。于是我们便可以设base=π(1-a[i][j]) ,然后令a[i][j] = a[i][j] / (1-a[i][j]),然后我们用矩阵树定理求一下a的行列式再乘上base就是答案了。

        但是当a[i][j]==1的时候,我们要近似一下a[i][j]。

    #include<bits/stdc++.h>
    #define ll long long
    #define D double
    const int maxn=106;
    using namespace std;
    const D eps=1e-9;
    D a[maxn][maxn],ans=1,base=1;
    bool flag=0;
    int n;
    
    inline int zt(D x){
    	if(fabs(x)<eps) return 0;
    	return x>0?1:-1;
    }
    
    inline void solve(){
    	for(int i=1;i<n;i++)
    	    for(int j=1;j<n;j++) if(i!=j) a[i][j]=-a[i][j];
    	
    	for(int i=1;i<n;i++){
    		int pos=i;
    		for(int j=i+1;j<n;j++) if(a[j][i]>a[pos][i]) pos=j;
    		if(pos!=i){
    			ans*=-1;
    		    for(int j=i;j<n;j++) swap(a[pos][j],a[i][j]);
    	    }
    		if(!zt(a[i][i])) break;
    		
    		for(int j=i+1;j<n;j++) if(zt(a[j][i])){
    			D tmp=a[j][i]/a[i][i];
    			for(int k=i;k<n;k++) a[j][k]-=a[i][k]*tmp;
    		}
    		
    		ans*=a[i][i];
    	}
    }
    
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)
    	    for(int j=1;j<=n;j++){
    	    	scanf("%lf",&a[i][j]);
    	    	if(a[i][j]==1) a[i][j]-=eps;
    	    	if(i<j) base=base*(1-a[i][j]);
    	    	a[i][j]=a[i][j]/(1-a[i][j]);
    		}
    		
    	for(int i=1;i<=n;i++)
    	    for(int j=i+1;j<=n;j++) a[i][i]+=a[i][j],a[j][j]+=a[i][j];
    	solve();
    	printf("%.11lf
    ",ans*base);
    	return 0;
    }
    

      

  • 相关阅读:
    Jquery zTree 插件实现简单的省市下拉
    requestAnimationFrame
    浏览器请求与域名的关系
    斐波那契数列 算法实现
    重置 bootstrap-fileinput
    Python 不定长参数 *args, **dictargs
    IPMITOOL常用操作指令
    IPMI 配置BMC用户设置
    图床折腾记
    [算法总结] 20 道题搞定 BAT 面试——二叉树
  • 原文地址:https://www.cnblogs.com/JYYHH/p/8672044.html
Copyright © 2011-2022 走看看