jzoj3748 【CF446D】DZY Loves Games(games)

本文介绍了一种在特定迷宫游戏中计算玩家触发福利关卡概率的方法。玩家在迷宫中随机移动,目标是在特定条件下到达指定房间。文章详细阐述了如何通过矩阵运算和方程组求解来高效计算这一概率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem

今天DZY 想要玩一个古老的游戏。他在一个有n 个房间并有m 个走廊互相连接的大迷宫里(每个走廊都允许双向通行)。你可以认为所有房间都被走廊直接或间接连接。
DZY 在迷宫里迷路了。现在他在第一房间并且有k 条命。他将会按如下所述行动:
首先,他会随机抽取一条从他现在所处房间出发的走廊。每个抽取范围内的走廊选中的机率相等。
然后他会沿着走廊走到走廊的另一端,并且回到第一步重复这个过程。
迷宫中的一些房间里面埋着陷阱。第一房间明显没有陷阱,第n 号房间明确地有一个陷阱。每次DZY 进入这些有陷阱的房间,他都会失去一条命。现在,DZY 知道如果他恰好有两条命时进入了第n 号房间,那么首先他会失去一条命,但是然后他会开启一个福利关卡。他想要知道他开启福利关卡的机率到底为多少。请帮助他。(陷阱最多100个)

对于30% 的数据,n<=10n<=10
对于100%的数据,2<=n<=500;1<=m<=105;2<=k<=1092<=n<=500;1<=m<=105;2<=k<=109

分析

w(u,v)为从房间 u 出发,到达房间 v,除了房间 u,v 外,经过的任何房间都没有陷阱的概率。
只需要求出w(u,v),即可通过矩阵乘法求答案。

显然,对于 u 相同的 w(u,v),可以通过高斯消元在 O(n^3)的时间内一起求出。因此, 求出所有 w(u,v)的时间复杂度为 O(n^4)。

但对于n<=500,O(n4)O(n4)是无法接受的时间复杂度,所以我们想办法将其优化到O(n3)O(n3)
先枚举起点u,设f[i]表示从起点u开始,到I且不经过陷阱点(不包括i,j)的概率是多少。

将黑点拆分为入点与出点后易得出方程f[i]=f[j]/d[j]f[i]=∑f[j]/d[j],黑点出点的贡献我们不列入方程内,因为其只能作为常数项存在(见下文)。
但是还要考虑一个特殊的起点:1号点。 考虑到只有一个特殊点,所以我们像黑点一样拆点,要注意的是由于1号点是不耗血的,所以绕圈回去是没有用的。不需要有入点。

这样我们可以解出方程,但由于没有确定的起点,所以没有常数,解得全为0.
但我们发现对于不变的系数矩阵,xixi可以表示成若干常数之和,xi=a1b1+a2b2...xi=a1∗b1+a2∗b2...
所以我们用O(n2(n+n))O(n2∗(n+n))求出每个未知数的常数系数。

显然初值为f[u]=1,我们可以发现黑出点u对某些方程有一个已知的贡献:1/d[u]1/d[u]。那么我们直接修改对应的常数。然后O(n)O(n)求w(u,v).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值