BZOJ.3143.[HNOI2013]游走(概率 期望 高斯消元)
把走每条边的概率乘上分配的标号就是它的期望,所以我们肯定是把大的编号分配给走的概率最低的边。
我们只要计算出经过所有点的概率,就可以得出经过一条边(\(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]\)为从点\(j\)走到点\(i\)的概率,即$$a[i][j]=\frac{1}{dgr[j]}$$
那么每个点的概率$$P_i=\sum_{(i,j)\in G} a[i][j]\times P[j]$$
注意走到\(n\)就不会再走了,所以高斯消元不处理与\(n\)有关的东西。
\(a[i][i]=1\),然后把每个概率\(P_i\)看做一个变量,可以列出\(n-1\)个含\(n-1\)个未知数的方程
\]
每个\(a[i][i]\)对应的变量就是\(P_i\)了。
因为一开始就在\(1\)号点,所以第一个方程的结果应设为\(1\),即\(P_1=1+\sum
\frac{P_j}{dgr[j]}\)。
高斯消元,复杂度\(O(n^3)\),好像有\(\frac{1}{6}\)的常数?
/*
12784kb 740ms
注意边数,没说就是n^2级别的!
精度(eps)要高!
高斯写错。。
*/
#include <cmath>
#include <cstdio>
#include <cctype>
#include <iostream>
#include <algorithm>
#define gc() getchar()
#define eps 1e-12
const int N=505,M=N*N*2;
int n,m,Enum,H[N],fr[M],to[M],nxt[M],dgr[N];
double A[N][N],Ans[N],pe[M];
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline void AddEdge(int u,int v)
{
++dgr[u], to[++Enum]=v, fr[Enum]=u, nxt[Enum]=H[u], H[u]=Enum;
++dgr[v], to[++Enum]=u, fr[Enum]=v, nxt[Enum]=H[v], H[v]=Enum;
}
inline bool cmp(const double &a,const double &b){
return std::fabs(a)>std::fabs(b);
}
void Gauss()
{
for(int j=1; j<n; ++j)
{
int mxrow=j;
for(int i=j+1; i<n; ++i)
if(cmp(A[i][j],A[mxrow][j])) mxrow=i;
if(mxrow!=j) std::swap(A[mxrow],A[j]);//和下一行也差不多
// if(mxrow!=j) for(int i=1; i<=n; ++i) std::swap(A[mxrow][i],A[j][i]);
for(int i=j+1; i<n; ++i)
if(fabs(A[i][j])>eps)//判一下显然快(吗?) 但要注意精度
// if(A[i][j])
{
double t=A[i][j]/A[j][j];
for(int k=j; k<=n; ++k)
A[i][k]-=A[j][k]*t;
}
}
for(int i=n-1; i; --i)
{
for(int j=i+1; j<n; ++j) A[i][n]-=A[i][j]*Ans[j];
Ans[i]=A[i][n]/A[i][i];
}
}
int main()
{
n=read(),m=read();
for(int u,v,i=1; i<=m; ++i) u=read(),v=read(),AddEdge(u,v);
for(int x=1; x<n; A[x][x]=1.0,++x)
for(int i=H[x]; i; i=nxt[i])
if(to[i]!=n) A[x][to[i]]=-1.0/dgr[to[i]];
A[1][n]=1.0;
Gauss();
for(int i=1; i<=m; ++i) pe[i]=Ans[fr[i<<1]]/dgr[fr[i<<1]]+Ans[to[i<<1]]/dgr[to[i<<1]];
std::sort(pe+1,pe+1+m,std::greater<double>());
double res=0;
for(int i=1; i<=m; ++i) res+=1.0*i*pe[i];
printf("%.3lf",res);
return 0;
}
BZOJ.3143.[HNOI2013]游走(概率 期望 高斯消元)的更多相关文章
- BZOJ 3143: [Hnoi2013]游走 [概率DP 高斯消元]
一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分 ...
- [HNOI2013] 游走 - 概率期望,高斯消元,贪心
假如我们知道了每条边经过的期望次数,则变成了一个显然的贪心.现在考虑如何求期望次数. 由于走到每个点后各向等概率,很显然一条边的期望次数可以与它的两个端点的期望次数,转化为求点的期望次数 考虑每个点对 ...
- BZOJ 3143 [Hnoi2013]游走 ——概率DP
概率DP+高斯消元 与博物馆一题不同的是,最终的状态是有一定的概率到达的,但是由于不能从最终状态中出来,所以最后要把最终状态的概率置为0. 一条边$(x,y)$经过的概率是x点的概率$*x$到$y$的 ...
- BZOJ 3143: [Hnoi2013]游走 概率与期望+高斯消元
Description 一个无向连通图,顶点从1编号到N,边从1编号到M.小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获 ...
- BZOJ 3143 游走(贪心+期望+高斯消元)
一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分 ...
- 【洛谷3232】[HNOI2013] 游走(贪心+高斯消元)
点此看题面 大致题意: 一个无向连通图,小\(Z\)从\(1\)号顶点出发,每次随机选择某条边走到下一个顶点,并将\(ans\)加上这条边的编号,走到\(N\)号顶点时结束.请你对边进行编号,使总分期 ...
- 2018.09.23 bzoj3143: [Hnoi2013]游走(dp+高斯消元)
传送门 显然只需要求出所有边被经过的期望次数,然后贪心把边权小的边定城大的编号. 所以如何求出所有边被经过的期望次数? 显然这只跟边连接的两个点有关. 于是我们只需要求出两个点被经过的期望次数. 对于 ...
- bzoj3143: [Hnoi2013]游走(贪心+高斯消元)
考虑让总期望最小,那么就是期望经过次数越多的边贪心地给它越小的编号. 怎么求每条边的期望经过次数呢?边不大好算,我们考虑计算每个点的期望经过次数f[x],那么一条边的期望经过次数就是f[x]/d[x] ...
- BZOJ 3143 游走 | 数学期望 高斯消元
啊 我永远喜欢期望题 BZOJ 3143 游走 题意 有一个n个点m条边的无向联通图,每条边按1~m编号,从1号点出发,每次随机选择与当前点相连的一条边,走到这条边的另一个端点,一旦走到n号节点就停下 ...
随机推荐
- JQuery中2个等号与3个等号的区别
首先,== equality 等同,=== identity 恒等.==, 两边值类型不同的时候,要先进行类型转换,再比较.===,不做类型转换,类型不同的一定不等. 下面分别说明:先说 ===,这个 ...
- <meta content='IE=edge,chrome=1' http-equiv='X-UA-Compatible' />
代码一:<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> http-eq ...
- 比特币全节点(bitcoind) eth 全节点
运行全节点的用途: 1.挖矿 2.钱包 运行全节点,可以做关于btc的任何事情,例如创建钱包地址.管理钱包地址.发送交易.查询全网的交易信息等等 选个节点钱包:bitcoind 1.配置文件: ...
- 用matplotlib制作的比较满意的蜡烛图
用matplotlib制作的比较满意的蜡烛图 2D图形制作包, 功能强大, 习练了很久, 终于搞定了一个比较满意的脚本. 特点: 使用方面要非常简单 绘制出来的图要非常的满意, 具有如下的特点 时间和 ...
- Web性能优化系列(1):Web性能优化分析
本文由 伯乐在线 - 鸭梨山大 翻译,sunbiaobiao 校稿.未经许可,禁止转载!英文出处:gokulkrishh.github.io.欢迎加入翻译小组. 如果你的网站在1000ms内加载完成, ...
- mac 无法验证副本
转: 这个是拆机后断了电源,导致时间不对,也就是说现在电脑的时间比U盘制作的时间还早,所以有这样的错误提示. 在终端里面修改时间请参考下面的代码,按回车键确认:date 062614102014.30 ...
- Linux - awk 文本处理工具三
AWK 文件打印匹配 格式示例 awk '/Tom/' file # 打印匹配到得行 awk '/^Tom/{print $1}' # 匹配Tom开头的行 打印第一个字段 awk '$1 !~ /ly ...
- git 修改已提交的注释
在git中,其commit提供了一个--amend参数,可以修改最后一次提交的信息 修改最后一次提交注释 git commit --amend 然后在出来的编辑界面,直接编辑注释的信息,保存退出 gi ...
- TP-Link wr703N 使用华为HiLink系列上网卡的设置【转】
转自:http://www.right.com.cn/forum/thread-103082-1-1.html 最近买了一个华为的E303s的上网卡,之前703的openwrt是按照需要拨号和使用U盘 ...
- Ansible 插件 之 【CMDB】【转】
Github地址: https://github.com/fboender/ansible-cmdb 从facts收集信息,生成主机概述 安装 wget https://github.com/fboe ...