正题

题目链接:https://www.luogu.com.cn/problem/CF446D


题目大意

给出nnn个点mmm条边的一张无向图,一些点有陷阱,走到时会损失一条生命,总共有kkk条生命,求从111出发随机游走到nnn没有死亡且到终点时仅剩一条命的概率。

1≤n≤500,1≤m≤105,2≤k≤1091\leq n\leq 500,1\leq m\leq 10^5,2\leq k\leq 10^91≤n≤500,1≤m≤105,2≤k≤109

陷阱点个数不超过100100100。


解题思路

这个kkk很大,这个陷阱点个数又很少,我们可以考虑矩阵乘法,预处理ai,ja_{i,j}ai,j​表示陷阱点iii走到陷阱点jjj且中间没有走陷阱点的概率,然后矩阵乘法转移即可。

但是现在的问题是我们如何快速预处理出ai,ja_{i,j}ai,j​,可以考虑枚举终点xxx那么有fx=1f_x=1fx​=1,然后其他的陷阱点处fx=0f_x=0fx​=0,一般的点处fx=1degx∑x→yfyf_x=\frac{1}{deg_x}\sum_{x\rightarrow y}f_{y}fx​=degx​1​∑x→y​fy​,这样我们就能对于每个起点预处理出gi,jg_{i,j}gi,j​表示从无陷阱的节点iii走到陷阱点jjj且中间没有其他陷阱点的概率。

之后我们枚举起点陷阱点的出边就可以预处理出aaa了,因为上面的过程要用到高斯消元,所以这样的复杂度是O(n4)O(n^4)O(n4)的,无法通过本题。

不难注意到上面的消元中,我们只有陷阱点处的常数(且陷阱点处仅有常数)发生了变化,所以我们可以直接高斯消出每个非陷阱点和所有陷阱点的关系式,然后直接带入常数即可。

记陷阱点个数为rrr,时间复杂度O((n+r)3+r3log⁡k)O((n+r)^3+r^3\log k)O((n+r)3+r3logk)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int N=610,S=110;
const double eps=1e-8;
struct matrix{double a[S][S];
}ans,m,c;
matrix operator*(const matrix &a,const matrix &b){memset(c.a,0,sizeof(c.a));for(int i=0;i<S;i++)for(int j=0;j<S;j++)for(int k=0;k<S;k++)c.a[i][j]+=a.a[i][k]*b.a[k][j];return c;
}
int n,h,k,deg[N],a[N][N];
double f[N][N];bool v[N];
vector<int> q;
int main()
{scanf("%d%d%d",&n,&h,&k);for(int i=1;i<=n;i++){scanf("%d",&v[i]);if(v[i]){q.push_back(i);f[i][n+q.size()]=f[i][i]=1;}}int r=n+q.size();for(int i=1,x,y;i<=h;i++){scanf("%d%d",&x,&y);a[x][y]++;a[y][x]++;deg[x]++;deg[y]++;}for(int i=1;i<=n;i++){if(v[i])continue;for(int j=1;j<=n;j++)f[i][j]=-1.0*a[i][j]/(double)deg[i];f[i][i]=1;}for(int i=1;i<=n;i++){for(int j=i;j<=n;j++)if(fabs(f[i][j])>eps){swap(f[i],f[j]);break;}double d=f[i][i];for(int j=i;j<=r;j++)f[i][j]=f[i][j]/d;for(int j=1;j<=n;j++){if(i==j)continue;double rate=-f[j][i]/f[i][i];for(int k=i;k<=r;k++)f[j][k]+=rate*f[i][k];}}for(int i=0;i<q.size();i++)ans.a[0][i]=f[1][n+i+1];for(int i=0;i<q.size();i++){for(int j=0;j<q.size();j++){for(int k=1;k<=n;k++)m.a[i][j]+=a[q[i]][k]*f[k][n+j+1];m.a[i][j]/=(double)deg[q[i]];}}k-=2;while(k){if(k&1)ans=ans*m;m=m*m;k>>=1;}printf("%.10lf\n",ans.a[0][q.size()-1]);return 0;
}

CF446D-DZY Loves Games【高斯消元,矩阵乘法】相关推荐

  1. CF446D. DZY Loves Games

    题目大意: 有一个连通的迷宫,你可以理解为一个 $n$ 个点 $m$ 条边的无向连通图.有 些点可能有陷阱,保证 $1$ 号点没有陷阱而 $n$ 号点存在陷阱.一开始你有 $k$  条命,每进入一个有 ...

  2. BZOJ_1778_[Usaco2010_Hol]_Dotp_驱逐猪猡_(期望动态规划+高斯消元+矩阵)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1778 炸弹从1出发,有\(\frac{P}{Q}\)的概率爆炸,如果不爆炸,等概率移动到连通的 ...

  3. Covering(dfs打表+高斯消元+矩阵快速幂)

    传送门 这是个递推题,可以看下维基的各种解释:传送门 假设递推式是一个四元方程,至于为什么也不大清楚(可能是操场是4*n的缘故) 然后得到递推式f(n)=f(n-1)+5*f(n-2)+f(n-3)- ...

  4. 矩阵树 Matrix-Tree 定理实现模板(高斯消元求解行列式)

    大佬1博客:https://www.cnblogs.com/zj75211/p/8039443.html 大佬2博客:https://www.cnblogs.com/yangsongyi/p/1069 ...

  5. 计算矩阵的逆和行列式的值(高斯消元+LU分解)

    计算矩阵的逆 选主元的高斯消元法 朴素的高斯消元法是将矩阵A和单位矩阵放在一起,通过行操作(或者列操作)将A变为单位矩阵,这个时候单位矩阵就是矩阵A的逆矩阵.从上到下将A变为上三角矩阵的复杂度为O(n ...

  6. bzoj 3503: [Cqoi2014]和谐矩阵(高斯消元)

    3503: [Cqoi2014]和谐矩阵 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special Judge Submit: 1101  Solved ...

  7. 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元

    题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两 ...

  8. HDU 4305 Lightning (高斯消元解kirchhoff矩阵+逆元)

    题意是:给一些坐标点,如果两点之间的距离小于R,并且两点之间没有其他点,则这两个点保持连通,这样构成了一个图.问这个图中生成树的个数. 因为数据量并不大,O(N^3)的建图没有问题. 建好图以后就可以 ...

  9. POJ 1830 开关问题 【01矩阵 高斯消元】

    任意门:http://poj.org/problem?id=1830 开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 1 ...

最新文章

  1. php 映射程序,windows磁盘映射技术分享
  2. 【牛客 - 272C】Balls(概率dp,结论,思维)
  3. 利用IDEA部署过的Tomcat开发Web Service
  4. Python一直报错:SyntaxError: invalid syntax 的原因及解决办法
  5. 页面每次添加都显示最后一次访问记录spring scope=prototype 学习笔记
  6. 操作系统—进程的定义、组成和组织方式(思维导图)
  7. django缓存优化(一)
  8. BootStrap:基础学习
  9. java 我的世界 反编译_基于mcp940反编译Minecraft源代码
  10. 实验二 /*网络嗅探与身份验证*/
  11. java转换成kotlin语言教程_#7 Kotlin教程 | 把Java转换为Kotlin
  12. 3Q双向可控硅与4Q双向可控硅对比好处
  13. java游戏服务器开发需要学习的技术
  14. 浙江万里学院计算机期末考,期末复习看这一篇推送就够了
  15. 中国联通正式公布3G资费标准
  16. 使用 Flutter 加速应用开发
  17. H5页面镶嵌到安卓,报错:undefined is not a function错误解决
  18. 使用Markdown排版微信公众号 代码格式化
  19. nanomsg----pair1 的介绍
  20. jyy的计算机系统基础里面在pa0分支下与master分支diff操作的更正

热门文章

  1. composer 查看php 版本_最常用的PHP版本:PHP 7.3取代7.2
  2. java 数组长度 可变_java基础之集合长度可变的实现原理
  3. 织梦首页html在哪儿,dedecms织梦首页去index.html
  4. mysql select 反选_JQuery实现全选、全不选和反选功能
  5. 计算机应用技术编译原理考试题,《编译原理》练习题库含答案(大学期末复习资料).doc...
  6. mysql 用户概念_传输概念 – db对象的用户/组/权限从mysql到postgresql
  7. thinkpadt450s换键盘视频_ikbc c87 入门级有线机械键盘测评
  8. 服务器磁盘系统,服务器磁盘阵列与操作系统
  9. mysql数据库5120_超傻瓜 H3C S5120 限速配置
  10. java获取机器号_(转)JAVA获得机器码的实现