【BZOJ3143】【HNOI2013】游走 && 【BZOJ3270】博物馆 【高斯消元+概率期望】
刚学完 高斯消元,我们来做几道题吧!
T1:【BZOJ3143】【HNOI2013】游走
Description
一个无向连通图,顶点从1编号到N,边从1编号到M。
小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数。当小 Z 到达 N 号顶点时游走结束,总分为所有获得的分数之和。
现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小。
Input
第一行是正整数N和M,分别表示该图的顶点数 和边数,接下来MM行每行是整数u,v(1≤u,v≤N)u,v(1≤u,v≤N),表示顶点u与顶点v之间存在一条边。
输入保证30%的数据满足N≤10,100%的数据满足2≤N≤500且是一个无向简单连通图。
Output
仅包含一个实数,表示最小的期望值,保留3位小数。
题解:
这明显是一道概率期望题嘛!
一条边经过的概率为 $E(u,v)={f_u \over deg_u}+{f_v \over deg_v}$ ,其中u,v为边的两个端点,fx 表示过x点的概率, degx 表示点 x的度数(出度、入度)。
一个点经过的概率为 $f_u=\sum_v f_v\times deg_v$ , v 为与 u 相连的一个节点。
知道了这些,我们还是不能用 dp 求解,因为它不符合决策单调性,即一个点走过去还能走回来,一个点的概率会互相影响,这我们就要列方程求解了。
$$a[i][j]= 1/deg[j]$$
我们这样列一个方程组,不过要注意的是 1号点它是必定经过的所以概率要加 1,n 的概率为 0
然后我们贪心,期望大的编号小。
CODE:
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std; int n,m,u[],v[],deg[];
double a[][],g[],res; void gauss(){
for(int i=,maxn=i;i<n;maxn=++i){
for(int j=i+;j<=n;j++)
if(fabs(a[j][i])>fabs(a[maxn][i]))maxn=j;
for(int j=;j<=n+;j++)swap(a[i][j],a[maxn][j]);
for(int j=i+;j<=n;j++){
if(fabs(a[j][i])<1e-)continue;
double s=a[j][i]/a[i][i];
for(int k=;k<=n+;k++)a[j][k]-=a[i][k]*s;
}
}
for(int i=n;i>=;i--){
for(int j=i+;j<=n;j++)
a[i][n+]-=a[i][j]*a[j][n+];
a[i][n+]/=a[i][i];
}
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
scanf("%d%d",u+i,v+i);
deg[u[i]]++,deg[v[i]]++;
}
a[][n+]=-,a[n][n]=;
for(int i=;i<=m;i++){
if(u[i]^n)a[u[i]][v[i]]=1.0/deg[v[i]];
if(v[i]^n)a[v[i]][u[i]]=1.0/deg[u[i]];
}
for(int i=;i<n;i++)a[i][i]=-;
gauss();
for(int i=;i<=m;i++)
g[i]=a[u[i]][n+]/deg[u[i]]+a[v[i]][n+]/deg[v[i]];
sort(g+,g+m+);
for(int i=;i<=m;i++)res+=g[i]*(m-i+);
printf("%.3f\n",res);
}
T2:【BZOJ3270】博物馆
Description
Input
Output
题解:
这回是两个人,同样 id[i][j] 表示 Petya 在 i ,Vasya 在 j 。
设 a[id[x][y]][id[i][j]] 为从状态 id[i][j] 转移到 id[x][y] 的概率来列个方程组
假设现在在 id[i][j] 这个状态上,接下来有这么几种情况
1:两个人同时停留在原点, a[id[i][j]][id[i][j]]=p[i]*p[j] ;
2:第一个人走到了x(前提是i->x有边存在), a[id[x][j]][id[i][j]]+=(1-p[i])/du[i]*p[j] ;
3:第二个人走到了y, a[id[i][y]][id[i][j]]+=p[i]*(1-p[j])/du[j] ;
4:第一个人走到了x,第二个人走到了y, a[id[x][y]][id[i][j]]+=(1-p[i])/du[i]*(1-p[j])/du[j] ;
同上,把方程解出来即可。
CODE:
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std; int n,m,u[],v[],deg[];
double a[][],g[],res; void gauss(){
for(int i=,maxn=i;i<n;maxn=++i){
for(int j=i+;j<=n;j++)
if(fabs(a[j][i])>fabs(a[maxn][i]))maxn=j;
for(int j=;j<=n+;j++)swap(a[i][j],a[maxn][j]);
for(int j=i+;j<=n;j++){
if(fabs(a[j][i])<1e-)continue;
double s=a[j][i]/a[i][i];
for(int k=;k<=n+;k++)a[j][k]-=a[i][k]*s;
}
}
for(int i=n;i>=;i--){
for(int j=i+;j<=n;j++)
a[i][n+]-=a[i][j]*a[j][n+];
a[i][n+]/=a[i][i];
}
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
scanf("%d%d",u+i,v+i);
deg[u[i]]++,deg[v[i]]++;
}
a[][n+]=-,a[n][n]=;
for(int i=;i<=m;i++){
if(u[i]^n)a[u[i]][v[i]]=1.0/deg[v[i]];
if(v[i]^n)a[v[i]][u[i]]=1.0/deg[u[i]];
}
for(int i=;i<n;i++)a[i][i]=-;
gauss();
for(int i=;i<=m;i++)
g[i]=a[u[i]][n+]/deg[u[i]]+a[v[i]][n+]/deg[v[i]];
sort(g+,g+m+);
for(int i=;i<=m;i++)res+=g[i]*(m-i+);
printf("%.3f\n",res);
}
【BZOJ3143】【HNOI2013】游走 && 【BZOJ3270】博物馆 【高斯消元+概率期望】的更多相关文章
- 2018.09.23 bzoj3143: [Hnoi2013]游走(dp+高斯消元)
传送门 显然只需要求出所有边被经过的期望次数,然后贪心把边权小的边定城大的编号. 所以如何求出所有边被经过的期望次数? 显然这只跟边连接的两个点有关. 于是我们只需要求出两个点被经过的期望次数. 对于 ...
- bzoj3143: [Hnoi2013]游走(贪心+高斯消元)
考虑让总期望最小,那么就是期望经过次数越多的边贪心地给它越小的编号. 怎么求每条边的期望经过次数呢?边不大好算,我们考虑计算每个点的期望经过次数f[x],那么一条边的期望经过次数就是f[x]/d[x] ...
- 【洛谷3232】[HNOI2013] 游走(贪心+高斯消元)
点此看题面 大致题意: 一个无向连通图,小\(Z\)从\(1\)号顶点出发,每次随机选择某条边走到下一个顶点,并将\(ans\)加上这条边的编号,走到\(N\)号顶点时结束.请你对边进行编号,使总分期 ...
- 【BZOJ-3270】博物馆 高斯消元 + 概率期望
3270: 博物馆 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 292 Solved: 158[Submit][Status][Discuss] ...
- BZOJ 3143 Luogu P3232 [HNOI2013]游走 (DP、高斯消元)
题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3143 (luogu) https://www.luogu.org/pro ...
- 【BZOJ-3143】游走 高斯消元 + 概率期望
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2264 Solved: 987[Submit][Status] ...
- BZOJ3270:博物馆(高斯消元)
Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博物馆.这座博物馆有着特别的样式.它包含由m条走廊连接的n间房间,并且满足可以从任何一 ...
- BZOJ3270 博物馆(高斯消元+概率期望)
将两个人各自所在点视为状态,新建一个图.到达某个终点的概率等于其期望次数.那么高斯消元即可. #include<iostream> #include<cstdio> #incl ...
- [JLOI2012]时间流逝 树上高斯消元 概率期望
题面 题意:(感觉题面写的题意是错的?)有\(n\)种能量不同的圈,设当前拥有的圈的集合为\(S\),则: 1,每天有\(p\)概率失去一个能量最小的圈.特别的,如果\(S = \varnothing ...
随机推荐
- NSString+TimeCategory
NSString+TimeCategory.h //------------------------------------------------ #import <foundation fo ...
- 自学Spring Boot
简介: Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配 ...
- Mybatis Cache 缓存策略
Mybatis Cache 缓存策略 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用 ...
- SQL与脚本语言
SQL是人类与数据库沟通的语言https://zhidao.baidu.com/question/413397944.html我个人认为SQL是一种专门对数据库进行操作的特殊的脚本语言.因为SQL语句 ...
- nyoj-248-buying feed
http://acm.nyist.net/JudgeOnline/problem.php?pid=248 BUYING FEED 时间限制:3000 ms | 内存限制:65535 KB 难度:4 ...
- 《3+1团队》第八次团队作业:Alpha冲刺
项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 3+1团队 团队博客地址 https://home.cnblogs.com/u/3-1group ...
- javaEE(5)_Cookie和Session
一.会话 1.什么是会话?会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话.类似打电话一样.2.会话过程中要解决的一些问题?每个用户 ...
- 【树形背包】bzoj4033: [HAOI2015]树上染色
仔细思考后会发现和51nod1677 treecnt有异曲同工之妙 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 ...
- 创建yum仓库
第1章 服务端)创建yum仓库目录 命令:(创建)mkdir -p /application/yum/centos6.6/x86_64/ 命令:(切换)cd /application/yum/cent ...
- 时间格式的处理和数据填充和分页---laravel
时间格式文档地址:http://carbon.nesbot.com/docs/ 这是些时间格式,只需要我们这么做就可以 我们在模板层,找到对应的模型对象那里进行处理就可以啦 2018-11-08 16 ...