首先,题目中的无向简单连通图代表着没有自环,重边...

总分的期望 = 每条边的期望之和...................每条边的期望又可以拆成$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\limits_{t = 0}^{\infty} p^i_t = p^i_0 + \sum\limits_{(i, v)} \frac{1}{du[v]} * \sum\limits_{t = 1}^{\infty} p^v_t = p^i_0 + \sum\limits_{(i, v)} \frac{1}{du[v]} * f[v]$

对于$f[1]$,有$p^1_0 = 1$

对于其他点,有$p^i_0 = 0$

列方程即可解决

注意$n$号节点,一旦到了$n$号节点,游走结束

因此,尽管$f[n]$在实际中为$1$,但是在方程中为了保证$n$号点不转移,令$f[n] = 0$

计算边的期望时,$f[n]$同样不参与计算

最后,求出了每条边的期望经过次数,希望总分期望尽量小

当然是经过次数多的边给小编号了,贪心即可!

复杂度$O(n^3)$

注:$500^2 = 250000$,不知道什么时候才会记住

注2:少用$luogu\;ide$调试,莫名少头文件...

#include <cmath>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std; extern inline char gc() {
static char RR[], *S = RR + , *T = RR + ;
if(S == T) fread(RR, , , stdin), S = RR;
return *S ++;
}
inline int read() {
int p = , w = ; char c = gc();
while(c > '' || c < '') { if(c == '-') w = -; c = gc(); }
while(c >= '' && c <= '') p = p * + c - '', c = gc();
return p * w;
} #define de double
#define ri register int
#define sid 505
#define eid 600005 int n, m, cnp, du[sid];
de ex[eid], f[sid][sid], g[sid];
int cap[sid], nxt[eid], node[eid]; inline void adeg(int u, int v) {
du[u] ++;
nxt[++ cnp] = cap[u]; cap[u] = cnp; node[cnp] = v;
} void Guass() {
for(ri i = ; i <= n; i ++) {
int p = i;
for(ri j = i; j <= n; j ++) if(fabs(f[j][i]) > fabs(f[p][i])) p = j;
swap(f[i], f[p]);
for(ri j = i + ; j <= n; j ++) {
de t = f[j][i] / f[i][i];
for(ri k = i; k <= n + ; k ++)
f[j][k] -= t * f[i][k];
}
}
for(ri i = n; i >= ; i --) {
f[i][n + ] = f[i][n + ] / f[i][i];
for(ri j = i - ; j >= ; j --)
f[j][n + ] -= f[i][n + ] * f[j][i];
}
for(ri i = ; i <= n; i ++) g[i] = f[i][n + ];
} int main() {
n = read(); m = read();
for(ri i = ; i <= m; i ++) {
int u = read(), v = read();
adeg(u, v); adeg(v, u);
}
#define cur node[j]
f[][n + ] = ; f[n][n] = ;
for(ri i = ; i < n; i ++) {
f[i][i] = ;
for(ri j = cap[i]; j; j = nxt[j])
f[i][cur] -= 1.0 / (de)(du[cur]);
}
Guass();
int bnp = ;
for(ri i = ; i <= n; i ++)
for(ri j = cap[i]; j; j = nxt[j])
ex[++ bnp] = g[i] / (de)du[i] + g[cur] / (de)du[cur];
sort(ex + , ex + bnp + );
de ans = ;
for(ri i = , j = ; i <= bnp; i += , j ++)
ans += ex[i] * (m - j + );
printf("%.3lf\n", ans);
return ;
}

luoguP3232 [HNOI2013]游走 贪心 + 概率期望 + 高斯消元的更多相关文章

  1. P3232 [HNOI2013]游走——无向连通图&&高斯消元

    题意 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编 ...

  2. BZOJ.3143.[HNOI2013]游走(概率 期望 高斯消元)

    题目链接 参考 远航之曲 把走每条边的概率乘上分配的标号就是它的期望,所以我们肯定是把大的编号分配给走的概率最低的边. 我们只要计算出经过所有点的概率,就可以得出经过一条边(\(u->v\))的 ...

  3. [HNOI2013] 游走 - 概率期望,高斯消元,贪心

    假如我们知道了每条边经过的期望次数,则变成了一个显然的贪心.现在考虑如何求期望次数. 由于走到每个点后各向等概率,很显然一条边的期望次数可以与它的两个端点的期望次数,转化为求点的期望次数 考虑每个点对 ...

  4. [HNOI2011]XOR和路径 概率期望 高斯消元

    题面 题解:因为异或不太好处理,,,因此按位来算,这样最后的答案就是每一位上的值乘对应的权值再求和.本着期望要倒退的原则,,,我们设$f[i]$表示从$i$到$n$,xor和为1的概率.那么观察$xo ...

  5. luoguP4457 [BJOI2018]治疗之雨 概率期望 + 高斯消元

    应该是最后一道紫色的概率了....然而颜色啥也代表不了.... 首先看懂题意: 你现在有$p$点体力,你的体力上限为$n$ 在一轮中, 1.如果你的体力没有满,你有$\frac{1}{m + 1}$的 ...

  6. 4.23 子串 AC自动机 概率期望 高斯消元

    考虑40分. 设出状态 f[i]表示匹配到了i位还有多少期望长度能停止.可以发现这个状态有环 需要高斯消元. 提供一种比较简单的方法:由于期望的线性可加性 可以设状态f[i]表示由匹配到i到匹配到i+ ...

  7. BZOJ4820 SDOI2017硬币游戏(概率期望+高斯消元+kmp)

    容易想到的做法是建出AC自动机,高斯消元.然而自动机上节点数量是nm的. 注意到我们要求的变量只有n个,考虑将其他不用求的节点合并为一个变量.这个变量即表示随机生成一个串,其不包含任何一个模板串的概率 ...

  8. UVA-10828 (概率期望+高斯消元)

    题意: 给个有向图,每个节点等概率转移到它的后继节点,现在问一些节点的期望访问次数; 思路: 对于一个点v,Ev=Ea/d[a]+Eb/d[b]+Ec/d[c];a,b,c是v的前驱节点; 然后按这个 ...

  9. [BZOJ3143][HNOI2013]游走(期望+高斯消元)

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3576  Solved: 1608[Submit][Status ...

随机推荐

  1. HDU 2191 珍惜现在,感恩生活 (dp)

    题目链接 Problem Description 急!灾区的食物依然短缺! 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都 ...

  2. 【转载】C#异常Retry通用类

    //Retry机制 public static class Retry { /// <summary> /// 重试零个参数无返回值的方法 /// </summary> /// ...

  3. ERROR in vc 6.0 (LINK : fatal error LNK1561: entry point must be defined)

    导致错误 LINK : fatal error LNK1561: entry point must be defined 的原因有很多种, 网上可以搜到很多, 一般是函数入口没定义, 或者修改为/su ...

  4. 牛奶ddw如何通过以太坊钱包实现互相打赏

    很多朋友不清楚如何转账ddw,但是万能的网友是无敌的,这两天就自己摸索的一点经验总结下今天的转账经验. 1. 提取到自己的账户 这个大家都知道如何操作,使用官方的钱包 在“日日盈app”中点击&quo ...

  5. Linux删除除了今天以外的文件

    [背景] 开发到日志记录功能时,每天都会产生当天的一个日志,久而久之就会产生累积,想要查看的时候,tab键无法自动补全,还要自己额外输入. 比较麻烦. [命令] 经过查找和实验,找到了以下的方法: 1 ...

  6. curl 发送请求的时候报错

    AWS HTTP error: cURL error 60: SSL certificate problem: unable to get local issuer certificate (see ...

  7. php面向对象中public与var的区别

    public和var的作用差不多 因为 var定义的变量如果没有加protected 或 private则默认为public php4 中一般是用 varphp5 中就一般是用 public了 现在基 ...

  8. Web开发入门知识小总结

    原来是写给 http://www.zhihu.com/question/22689579 的答案,也算是学了一学期web课程后的一点小总结,搬运到博客里存一下吧~ ================== ...

  9. day3 作业

    文件操作用户很广泛,我们经常对文件进行操作: global log 127.0.0.1 local2 daemon maxconn log 127.0.0.1 local2 info defaults ...

  10. 如何使用Inno Setup Compiler制作安装软件包

    工具/原料   Inno Setup Compiler汉化版软件 方法/步骤     启动Inno Setup Compiler汉化版软件.   选择创建新的空白脚本文件,按确定.   然后按下一步. ...