题目大意:
一个无向图,节点1有一个炸弹,在每个单位时间内,有可能在这个节点炸掉,也有p/q的概率随机选择一条出去的路到其他的节点上。问最终炸弹在每个节点上爆炸的概率。
分析:
一看就知道是跟矩阵有关系的。
一些基本常识:
图的邻接矩阵(i与j之间有路为1,无路为0)自己与自己相乘N次的结果中[i,j]的值就是到达[i,j]的长度为N的不同路径的种类数。
于是可以想到:
构造矩阵M,使得M[i,j]为炸弹上一个时间在j点、下一个时间走到i的概率,则M自己与自己相乘N次的结果M'的[i,j]就是最初在i点,N时间过后走到j点的概率。
则M'的第一列就是从节点1出发到其他各个节点的概率。设为列向量A。则A=M'*B,其中B=(1,0,0,0,...)T
在时间N过后,炸弹在每个节点爆炸的概率设为列向量PN
。
时间0:P0 = p/q * B
时间1:P1 = p/q * M * B
时间N:PN = p/q * MN * B
我们要求的结果就是 Ans=P0 +P1 +P2 +P3 +......
根据无穷递缩等比数列求和公式,Ans=p/q * (I-M)-1 *B
即 (I-M) * Ans = p/q * B。
这是一个线性方程组,用高斯消元的方法可解。
C++源程序: