题意:给定一个 n 个结点的有向图,然后从 1 结点出发,从每个结点向每个后继结点的概率是相同的,当走到一个没有后继结点后,那么程序终止,然后问你经过每个结点的期望是次数是多少. 析:假设 i 结点的出度为 di,期望执行次数为 xi,对于一个有 n 个前继结点的 a1, a2, a3 ... an 的结点 i,可以列出方程 xi = xa1/da1 + xa2/da2 + .. + xan/dan,根据每个结点都可以列出一个方程,然后就有 n 个方程,其中结点 1 比较特殊,因为是由它开始的所…
正题 题目链接:https://www.luogu.com.cn/problem/P4321 题目大意 给出\(n\)个点\(m\)条边的一张无向图,\(q\)次询问. 每次询问给出一个点集和一个起点,求从起点出发随机游走经过所有点集的期望步数. \(n\in[1,18],m\in[1,\frac{n(n-1)}{2}],q\in[1,10^5]\) 解题思路 首先\(n\)很小可以状压经过点的状态,然后因为这个询问是给出起始状态所以需要倒推.设\(f_{s,x}\)表示目前状态是\(s\),在…
啊 我永远喜欢期望题 BZOJ 3143 游走 题意 有一个n个点m条边的无向联通图,每条边按1~m编号,从1号点出发,每次随机选择与当前点相连的一条边,走到这条边的另一个端点,一旦走到n号节点就停下.每经过一条边,要付出这条边的编号这么多的代价.现将所有边用1~m重新编号,使总代价的期望最小,求这个最小值. 题解 我们可以求出每条边的期望经过次数,然后贪心地让经过次数多的边编号小即可. 直接用边来列方程求经过次数似乎列不出来,我们借助点来列方程. 设x[u]为从某个点出发的次数的期望,v为与u…
[题意]给定n个点m条边的无向连通图,每条路径的代价是其编号大小,每个点等概率往周围走,要求给所有边编号,使得从1到n的期望总分最小(求该总分).n<=500. [算法]期望+高斯消元 [题解]显然,应使经过次数越多的边编号越小,问题转化为求每条边的期望经过次数. 边数太多,容易知道f(u,v)=f(u)/out(u)+f(v)/out(v),所以转化为求每个点的期望经过次数,这就是驱逐猪猡了. 设f[x]表示点x的期望经过次数,根据全期望公式(讨论“经过“的问题不能依赖于下一步): $$f[x…
[题意]给定n个点m条边的带边权无向连通图(有重边和自环),在每个点随机向周围走一步,求1到n的期望路径异或值.n<=100,wi<=10^9. [算法]期望+高斯消元 [题解]首先异或不满足期望的线性,所以考虑拆位. 对于每一个二进制位,经过边权为0仍是x,经过边权为1变成1-x(转化成减法才满足期望的线性). 设f[x]表示点x到n的路径xor期望,f[n]=0,根据全期望公式: $$f[i]=\sum_{j}\frac{f[j]}{out[i]}\ \ , \ \ w(i,j)=0$$…
3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3576  Solved: 1608[Submit][Status][Discuss] Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数.当小Z 到达N号顶点时游走结束,总分为所有获得的分…
题目传送门 题意:在n*m的网格上,有一个机器人从(x,y)出发,每次等概率的向右.向左.向下走一步或者留在原地,在最左边时不能向右走,最右边时不能像左走.问走到最后一行的期望. 思路:显然倒着算期望. 我们考虑既不是最后一行,也不靠边的一般方格,设$f[i][j]$为(i,j)这个格子的期望步数,显然有 $f[i][j]=\frac{1}{4}*(f[i][j-1]+f[i][j+1]+f[i+1][j]+f[i][j])+1$ 移项有:$f[i][j]=\frac{1}{3}(f[i][j-…
如果纯模拟,就会死循环,而随着循环每个点的期望会逼近一个值,高斯消元就通过列方正组求出这个值. #include<cstdio> #include<cctype> #include<cstring> #include<algorithm> using namespace std; const double eps=1e-9; bool vis[503]; double f[503],a[503][503],ans[500*500]; int N,M,cnt=…
纪念首道期望题(虽说绿豆蛙的归宿才是,但是我打的深搜总觉得不正规). 我们求出每条边的期望经过次数,然后排序,经过多的序号小,经过少的序号大,这样就可以保证最后的值最小. 对于每一条边的期望经过次数,其实是从它起点和终点来的.设f[]为每个点经过的期望,out[]为每个点的出度 设一条边,起点为u,终点为v.那么它的期望经过次数为f[u]/out[u]+f[v]/out[v] 这样问题就转化为求每个点的期望经过次数了 对于起点,一开始经过一次,也可能从其他点走过来. f[1]=1+sigma(f…
题意 题目链接 Sol 期望的线性性对xor运算是不成立的,但是我们可以每位分开算 设\(f[i]\)表示从\(i\)到\(n\)边权为1的概率,统计答案的时候乘一下权值 转移方程为 \[f[i] = (w = 1) \frac{1 - f[to]}{deg[i]} +(w = 0) \frac{f[to]}{deg[i]} \] 高斯消元解一下 注意:f[n] = 0,有重边! #include<bits/stdc++.h> using namespace std; const int MA…
题目链接 参考 远航之曲 把走每条边的概率乘上分配的标号就是它的期望,所以我们肯定是把大的编号分配给走的概率最低的边. 我们只要计算出经过所有点的概率,就可以得出经过一条边(\(u->v\))的概率\(P_{ei}\).用\(dgr[i]\)表示点\(i\)的度数,那么\[P_{ei}=\frac{P_u}{dgr[u]}+\frac{P_v}{dgr[v]}\] 每个点的概率怎么求呢?就是\[P_i=\sum_{(i,j)\in G}\frac{P_j}{dgr[j]}\] 用\(a[i][j…
一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数.当小Z 到达N号顶点时游走结束,总分为所有获得的分数之和. 现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小. 总分的期望值=每条边的期望经过次数*边的编号 之和. 不论我们如何编号,每条边的期望经过次数是不会变的,要使得边权和的期望最小,只需要贪心地使期望次数和边权倒序对应即可.…
题面 题解:因为异或不太好处理,,,因此按位来算,这样最后的答案就是每一位上的值乘对应的权值再求和.本着期望要倒退的原则,,,我们设$f[i]$表示从$i$到$n$,xor和为1的概率.那么观察$xor$的规则:1 xor 1 = 00 xor 1 = 1 ----> 当xor 1时,结果为1的概率 = 原本为0的概率1 xor 0 = 1 0 xor 0 = 0 ----> 当xor 0时,结果为1的概率 = 原本为1的概率因此我们有如下转移:$$f[x] = \frac{1}{d_{x}}…
应该是最后一道紫色的概率了....然而颜色啥也代表不了.... 首先看懂题意: 你现在有$p$点体力,你的体力上限为$n$ 在一轮中, 1.如果你的体力没有满,你有$\frac{1}{m + 1}$的几率回复一点体力 2.紧接着有$k$轮攻击,每轮攻击都有$\frac{1}{m + 1}$的几率使你掉一点体力 如果一轮后,你的体力$ \leq 0$,那么游戏结束 询问游戏结束的期望轮数 看懂题应该就懂了什么吧.... 设状态$f[i]$表示生命值为$i$游戏结束的期望轮数 那么 $$f[i] =…
CodeForces 24D Broken robot 大致题意:你有一个n行m列的矩形板,有一个机器人在开始在第i行第j列,它每一步会随机从可以选择的方案里任选一个(向下走一格,向左走一格,向右走一格,留在原地),现在我们要求它走到最后一行的期望步数 \(solution:\) 这道题我们可以从最后一行开始递推,但是我们很快发现会有一些难以解决的方程.因为每一行的每一个格子都可以组成一个方程,但是这些格子都是未知的,只有他们的下一行的所有格子已知(我们从下向上倒推,这是一个惯用套路).也就是说…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3143 只需算出每条边被经过的概率,将概率从小到大排序,从大到小编号,就可得到最小期望: 每条边经过的概率是其两端的点被走的次数/该点的度数的和: 而每个点被走的次数又需要从与其相连的点推过来,所以构成n个n元方程,进行高斯消元求解: 其中点n较为特殊,可以不去管它,因为所有路径到n后就不再走出来,也就是n到n的概率为0: 而因为所有路径从点1开始,所以1的次数平地+1. 代码如下: #in…
和游走挺像的,都是将概率转成期望出现的次数,然后拿高斯消元来解. #include <bits/stdc++.h> #define N 23 #define setIO(s) freopen(s".in","r",stdin) using namespace std; double in[N],out[N],f[N*N][N*N]; int G[N][N],deg[N],idx[N][N],tot; void Gauss(int n) { int i,j…
Description 一个无向连通图,顶点从1编号到N,边从1编号到M.小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数.当小Z 到达N号顶点时游走结束,总分为所有获得的分数之和.现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小. Input 第一行是正整数N和M,分别表示该图的顶点数 和边数,接下来M行每行是整数u,v(1≤u,v≤N),表示顶点u与顶点v之间存在一条边. 输入保…
Time Limit: 30 Sec  Memory Limit: 128 MB 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博物馆.这座博物馆有着特别的样式.它包含由m条走廊连接的n间房间,并且满足可以从任何一间房间到任何一间别的房间. 两个人在博物馆里逛了一会儿后两人决定分头行动,去看各自感兴趣的艺术品.他们约定在下午六点到一间房间会合.然而他们忘记了一件重要的事:他们并没有选好在哪儿碰面.等时间到六点,他们开始在博物馆里到处乱跑来找到对方(他们…
假如我们知道了每条边经过的期望次数,则变成了一个显然的贪心.现在考虑如何求期望次数. 由于走到每个点后各向等概率,很显然一条边的期望次数可以与它的两个端点的期望次数,转化为求点的期望次数 考虑每个点对另个点的贡献,得到方程组,暴力高斯消元 注意走到最后一个点就结束了,所以相当于它不能有出边 #include <bits/stdc++.h> #define eps 1e-6 using namespace std; const int N = 1005; double a[N][N]; int…
考虑40分. 设出状态 f[i]表示匹配到了i位还有多少期望长度能停止.可以发现这个状态有环 需要高斯消元. 提供一种比较简单的方法:由于期望的线性可加性 可以设状态f[i]表示由匹配到i到匹配到i+1需要的期望长度. 需要预处理前缀和和KMP的nex数组来辅助转移. if(n==1) { gc(a); len=strlen(a+1); ll j=0; memset(nex,0,sizeof(nex)); rep(2,len,i) { while(j&&a[i]!=a[j+1])j=nex…
题目描述 传送门 分析 首先判掉 \(INF\) 的情况 第一种情况就是不能从 \(s\) 走到 \(t\) 第二种情况就是从 \(s\) 出发走到了出度为 \(0\) 的点,这样就再也走不到 \(t\) 然后我们去考虑 \(60\) 分的做法 我们设 \(dp[u]\) 为当前在点 \(u\) 走到点 \(t\) 的期望步数 那么就有 \(dp[u]=\sum_{u->v}^v((dp[v]+1) \times \frac{1}{rd[u]})\) 移项之后就变成了 \(dp[u]-\sum_…
题意: 给个有向图,每个节点等概率转移到它的后继节点,现在问一些节点的期望访问次数; 思路: 对于一个点v,Ev=Ea/d[a]+Eb/d[b]+Ec/d[c];a,b,c是v的前驱节点; 然后按这个列出方程,进行高斯约旦消元,然后判断是否可达和是否为0; 代码是白书上的; AC代码: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include…
首先,题目中的无向简单连通图代表着没有自环,重边... 总分的期望 = 每条边的期望之和...................每条边的期望又可以拆成$u \to v$的期望和$v \to u$的期望 记$f[i]$表示$1 \to n$的路径中,$i$的期望经过次数 而$u \to v$的期望只要知道$f[u], f[v]$就可以求出 注意到,$f[i]$为每个时刻点在$i$的概率之和,即$\sum\limits_{t =0}^{\infty} p^i_t$ 那么,我们有$f[i] = \sum…
这个还挺友好的,自己相对轻松能想出来~令 $f[i]$ 表示起点到点 $i$ 的期望次数,则 $ans[i]=f[i]\times \frac{p}{q}$ #include <cmath> #include <cstdio> #include <algorithm> #define N 305 #define setIO(s) freopen(s".in","r",stdin) , freopen(s".out&quo…
题意 题目链接 Sol 设\(f[i][j]\)表示Petya在\(i\),\(Vasya\)在\(j\)的概率,我们要求的是\(f[i][i]\) 直接列方程高斯消元即可,由于每个状态有两维,因此时间复杂度为\(O(n^6)\) 注意不能从终止节点转移而来 #include<bits/stdc++.h> using namespace std; const int MAXN = 2333; inline int read() { char c = getchar(); int x = 0,…
容易想到的做法是建出AC自动机,高斯消元.然而自动机上节点数量是nm的. 注意到我们要求的变量只有n个,考虑将其他不用求的节点合并为一个变量.这个变量即表示随机生成一个串,其不包含任何一个模板串的概率. 现在即有n+1个变量,考虑列出n+1个方程.设pi表示第i个人胜利的概率,显然有Σpi=1.然后对每个pi列一个方程,即考虑其胜利概率.在无胜利者的随机串后面接上这个串,这样这个人有可能成为胜利者,但也有可能之前的随机串加上这个串的一段前缀后已经包含了另一个串(可能是其自身),需要减掉这一部分.…
题面 传送门 思路 本题的点数很少,只有20个 考虑用二元组$S=(u,v)$表示甲在$u$点,乙在$v$点的状态 那么可以用$f(S)$表示状态$S$出现的概率 不同的$f$之间的转移就是通过边 转移有4种情况 对于$S=(u,v)$来说,有以下四种转移: 转移一,甲乙都选择不动,此时从$S$转移到$S$,概率为$p[u]*p[v]$ 转移二,甲动乙不动,此时从$S$转移到$S'=(u',v)$,其中$u'$是异于$u$并与$u$相连的点,概率为$\frac{1-p[u]}{deg[u]}*p…
UVA 10828 - Back to Kernighan-Ritchie 题目链接 题意:给图一个流程图,有结点的流程,每次进入下一个流程概率是均等的,有q次询问,求出每次询问结点的运行期望 思路:高斯消元,每一个结点的期望等于全部前趋结点的期望/出度的和,因为存在无限循环的情况,不能直接递推,利用高斯消元去做,推断无解的情况既为无限循环,注意假设一个式自xi为0,可是xn也为0,xi值应该是0,表示无法到达 代码: #include <cstdio> #include <cstrin…
[BZOJ3143]游走(高斯消元,数学期望) 题面 BZOJ 题解 首先,概率不会直接算... 所以来一个逼近法算概率 这样就可以求出每一条边的概率 随着走的步数的增多,答案越接近 (我卡到\(5000\)步可以拿\(50\)分) #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorith…