luoguP3232 [HNOI2013]游走 贪心 + 概率期望 + 高斯消元
首先,题目中的无向简单连通图代表着没有自环,重边...
总分的期望 = 每条边的期望之和...................每条边的期望又可以拆成$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]游走 贪心 + 概率期望 + 高斯消元的更多相关文章
- P3232 [HNOI2013]游走——无向连通图&&高斯消元
题意 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编 ...
- BZOJ.3143.[HNOI2013]游走(概率 期望 高斯消元)
题目链接 参考 远航之曲 把走每条边的概率乘上分配的标号就是它的期望,所以我们肯定是把大的编号分配给走的概率最低的边. 我们只要计算出经过所有点的概率,就可以得出经过一条边(\(u->v\))的 ...
- [HNOI2013] 游走 - 概率期望,高斯消元,贪心
假如我们知道了每条边经过的期望次数,则变成了一个显然的贪心.现在考虑如何求期望次数. 由于走到每个点后各向等概率,很显然一条边的期望次数可以与它的两个端点的期望次数,转化为求点的期望次数 考虑每个点对 ...
- [HNOI2011]XOR和路径 概率期望 高斯消元
题面 题解:因为异或不太好处理,,,因此按位来算,这样最后的答案就是每一位上的值乘对应的权值再求和.本着期望要倒退的原则,,,我们设$f[i]$表示从$i$到$n$,xor和为1的概率.那么观察$xo ...
- luoguP4457 [BJOI2018]治疗之雨 概率期望 + 高斯消元
应该是最后一道紫色的概率了....然而颜色啥也代表不了.... 首先看懂题意: 你现在有$p$点体力,你的体力上限为$n$ 在一轮中, 1.如果你的体力没有满,你有$\frac{1}{m + 1}$的 ...
- 4.23 子串 AC自动机 概率期望 高斯消元
考虑40分. 设出状态 f[i]表示匹配到了i位还有多少期望长度能停止.可以发现这个状态有环 需要高斯消元. 提供一种比较简单的方法:由于期望的线性可加性 可以设状态f[i]表示由匹配到i到匹配到i+ ...
- BZOJ4820 SDOI2017硬币游戏(概率期望+高斯消元+kmp)
容易想到的做法是建出AC自动机,高斯消元.然而自动机上节点数量是nm的. 注意到我们要求的变量只有n个,考虑将其他不用求的节点合并为一个变量.这个变量即表示随机生成一个串,其不包含任何一个模板串的概率 ...
- UVA-10828 (概率期望+高斯消元)
题意: 给个有向图,每个节点等概率转移到它的后继节点,现在问一些节点的期望访问次数; 思路: 对于一个点v,Ev=Ea/d[a]+Eb/d[b]+Ec/d[c];a,b,c是v的前驱节点; 然后按这个 ...
- [BZOJ3143][HNOI2013]游走(期望+高斯消元)
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3576 Solved: 1608[Submit][Status ...
随机推荐
- Try finally的一个实验和为什么避免重载 finalize()方法--例子
public class TryFinallTest { public TryFinallTest(){ } public void runSomething(String str){ System. ...
- 51nod 1217 Minimum Modular
N个不同的数a[1],a[2]...a[n],你可以从中去掉K个数,并且找到一个正整数M,使得剩下的N - K个数,Mod M的结果各不相同,求M的最小值. Input 第1行:2个数N, K,中间用 ...
- oschina ios开发学习
应该跟android版的类似,例如服务器端在oschina-prefix.pch里 #define api_news_list @"http://www.oschina.net/action ...
- vue-cli使用说明
一.安装npm install -g vue-cli 推荐使用国内镜像 先设置cnpm npm install -g cnpm --registry=https://registry.npm.taob ...
- 49、是否使用过functools中的函数?其作用是什么?
functools模块介绍 functools用于高阶函数:指那些作用于函数或者返回其他函数的函数.通常情况下,只要是可以被当做函数调用的对象就是这个模块的目标. functools模块的功能 pyt ...
- 超级ping(多线程版)
发现学校公共wifi的ip段是10.1.0-255.0-255段的,还是之前的思路批量ping一波. 其实可以使用nmap的.但是脚本写都写了.是吧.你懂的. #!/usr/bin/env pytho ...
- UNDO自我理解总结
[场景] 当在更新数据的时候,发现更新的值写错了,这时就需要将已经更新的地方恢复到原始数据. [基本概念] 在更新的过程中,Oracle会将原始的数据都放入到UNDO里,这样当以上情况发生后,就可以从 ...
- day01作业
Java技术按照用途不同分为三大版本,分别是JavaSE.JavaEE和JavaMeJava虚拟机就是一个虚拟的用于执行字节码文件的计算机.它是Java最核心的技术,是Java跨平台的基础.DOS命令 ...
- java1.8环境配置+win10系统
Java环境配置相关 Java jdk 1.8版本的环境配置和1.7版本 存在一些差异,当然不同的操作系统可能会对jdk配置有一定的变化.本文我主要说1.8版本的jdk在window10 系统上的配置 ...
- gentoo emerge unable to sync
gentoo emerge unable to sync Author: Tubo After setting SYNC to customized URL: SYNC="rsync://m ...