BZOJ 3143 [Hnoi2013]游走 ——概率DP
概率DP+高斯消元
与博物馆一题不同的是,最终的状态是有一定的概率到达的,但是由于不能从最终状态中出来,所以最后要把最终状态的概率置为0。
一条边$(x,y)$经过的概率是x点的概率$*x$到$y$的概率+$y$的概率$*y$到$x$的概率。
然后直接高斯消元即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define maxn 500005 double a[505][505],p[500005];
int h[maxn],fr[maxn],to[maxn],ne[maxn],en=0,n,m,du[maxn]; void add(int a,int b)
{to[en]=b;fr[en]=a;ne[en]=h[a];h[a]=en++;} void solve(int x)
{
a[x][x]=1; if (x==n) return;
for (int i=h[x];i>=0;i=ne[i])
{
if (to[i]==n) continue;
a[x][to[i]]-=1.0/du[to[i]];
}
} void gauss()
{
F(i,1,n)
{
int tmp=i;
while (!a[tmp][i]&&tmp<=n) tmp++;
if (tmp>n) continue;
F(j,i,n+1) swap(a[i][j],a[tmp][j]);
F(j,1,n) if (j!=i)
{
double t=a[j][i]/a[i][i];
F(k,1,n+1) a[j][k]-=t*a[i][k];
}
}
} int main()
{
memset(h,-1,sizeof h);
scanf("%d%d",&n,&m);
F(i,1,m)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);add(b,a);
du[a]++;du[b]++;
}
F(i,1,n) solve(i);
a[1][n+1]=1;
gauss();
F(i,1,n) a[i][i]=a[i][n+1]/a[i][i];
int tot=0;
for (int i=0;i<en;i+=2)
p[++tot]=a[fr[i]][fr[i]]/(du[fr[i]]*1.0)+a[to[i]][to[i]]/(du[to[i]]*1.0);
sort(p+1,p+tot+1);
double ans=0;
F(i,1,tot) ans+=p[i]*(m-i+1);
printf("%.3f\n",ans);
}
BZOJ 3143 [Hnoi2013]游走 ——概率DP的更多相关文章
- BZOJ 3143: [Hnoi2013]游走 [概率DP 高斯消元]
一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分 ...
- bzoj 3143 [Hnoi2013]游走 期望dp+高斯消元
[Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3394 Solved: 1493[Submit][Status][Disc ...
- BZOJ 3143: [Hnoi2013]游走 概率与期望+高斯消元
Description 一个无向连通图,顶点从1编号到N,边从1编号到M.小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获 ...
- BZOJ.3143.[HNOI2013]游走(概率 期望 高斯消元)
题目链接 参考 远航之曲 把走每条边的概率乘上分配的标号就是它的期望,所以我们肯定是把大的编号分配给走的概率最低的边. 我们只要计算出经过所有点的概率,就可以得出经过一条边(\(u->v\))的 ...
- bzoj 3143: [Hnoi2013]游走 高斯消元
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1026 Solved: 448[Submit][Status] ...
- BZOJ 3143 HNOI2013 游走 高斯消元 期望
这道题是我第一次使用高斯消元解决期望类的问题,首发A了,感觉爽爽的.... 不过笔者在做完后发现了一些问题,在原文的后面进行了说明. 中文题目,就不翻大意了,直接给原题: 一个无向连通图,顶点从1编号 ...
- bzoj 3143: [Hnoi2013]游走
Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...
- bzoj 3143 [Hnoi2013]游走【高斯消元+dp】
参考:http://blog.csdn.net/vmurder/article/details/44542575 和2337有点像 设点u的经过期望(还是概率啊我也分不清,以下都分不清)为\( x[u ...
- bzoj 3143 [Hnoi2013]游走(贪心,高斯消元,期望方程)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3143 [题意] 给定一个无向图,从1走到n,走过一条边得到的分数为边的标号,问一个边的 ...
随机推荐
- 判断后台service是否在运行
public static boolean isServiceRunning(Context mContext,String className) { boolean isRunning = fals ...
- SQL根据出生日期精确计算年龄、获取日期中的年份、月份
第一种: 一张人员信息表里有一人生日(Birthday)列,跟据这个列,算出该人员的年龄 datediff(year,birthday,getdate()) 例:birthday = '2003-3- ...
- IOS画线条
- (void)drawRect:(CGRect)rect { // draw a rounded rect bezier path filled with blue CGContextRef aRe ...
- Java文件操作系列[1]——PDFBox实现分页提取PDF文本
需求:用java分页提取PDF文本. PDFBox是一个很好的可以满足上述需求的开源工具. 1.PDF文档结构 要解析PDF文本,我们首先要了解PDF文件的结构. 关于PDF文档,最重要的几点: 一, ...
- ConCurrent in Practice小记 (4)
ConCurrent in Practice小记 (4) Executors Callable && Future <T> Callable:此接口有一个call()方法. ...
- jquery的load方法
load方法指定一个界面会显示在目标的标签内部 比如MVC的一个分部视图页面想要显示在某个标签里面,可以写成 $(标签ID).load(分部视图名称,data) 其中第二个参数可选,主要是一些需要传递 ...
- codeforces Gym 100338F Spam Filter 垃圾邮件过滤器(模拟,实现)
阅读题, 概要:给出垃圾邮件和非垃圾邮件的集合,然后按照题目给出的贝叶斯公式计算概率一封邮件是垃圾邮件的概率. 逐个单词判断,将公式化简一下就是在垃圾邮件中出现的次数和在总次数的比值,大于二分之一就算 ...
- dubbo 快速入门
1. 步骤 实现消费者调用生产者服务接口. 2.安装zookeeper 3.创建maven 工程 4.安装dobboadmin 平台实现监控 5.dubbo 目录结构 ------dubbo-mem ...
- pre-receive hook declined
没有master分支的代码提交权限. 分配权限或者提交分支合并申请
- shell脚本,用awk实现替换文件里面的内容。
文件是这样,有ID和具体信息,ID行以@开头,后面的信息有空格,把第一个空格后的全部内容替换为空格前的字符. 用AWK来实现. @AA10 P 7 #YYYYYYYYYYYYYYYYYYZZZZZZZ ...