●BZOJ 2337 [HNOI2011]XOR和路径
题链:
http://www.lydsy.com/JudgeOnline/problem.php?id=2337
题解:
概率dp,
因为异或的每一位之间没有关系,我们就依次考虑每一位k。(即边权要么为1,要么为0)
令dp[i]表示从i出发到n点的边权异或和为1的概率。
然后转移:(令cnt[i]表示i的度)
$$dp[i]=\sum_{i->j,边权为0}\frac{dp[j]}{cnt[i]}+\sum_{i->j,边权为1}\frac{1-dp[j]}{cnt[i]}$$
$$dp[N]=0$$
然后可以列出这样N个式子,是一个循环dp,可以用高斯消元解出每个dp值。
所以这一位k期望的贡献就是(dp[1]*1)<<(k-1)
(正推不太好做,因为1-f[i]不仅包含了从1到i的异或值为0的概率,还包括了从1不到i的概率。)
(如果不太能理解上面那句话,可以看看我的这篇博客关于正反向进行期望DP的一点探究(有一丢丢长))
代码:
#include<bits/stdc++.h>
#define MAXN 105
#define MAXM 10005
using namespace std;
const double eps=1e-8;
double ANS,a[MAXN][MAXN],dp[MAXN];
double *A[MAXN];
int N,M,Ant;
int cnt[MAXN];
struct Edge{
int ent;
int to[MAXM*2],val[MAXM*2],nxt[MAXM*2],head[MAXN];
Edge():ent(2){}
void Adde(int u,int v,int w){
to[ent]=v; val[ent]=w; nxt[ent]=head[u]; head[u]=ent++;
}
}E;
int dcmp(double x){
if(fabs(x)<eps) return 0;
else return x>0?1:-1;
}
void buildequation(int p){
for(int i=1;i<=N;i++){
for(int j=1;j<=N+1;j++) a[i][j]=0;
if(i==N){a[i][i]=1; continue;}
a[i][i]=cnt[i];
for(int j=E.head[i];j;j=E.nxt[j]){
int v=E.to[j];
if(E.val[j]&(1<<p)) a[i][v]+=1,a[i][N+1]+=1;
else a[i][v]-=1;
}
}
for(int i=1;i<=N;i++) A[i]=a[i];
}
void Gausselimination(int pos,int i){
if(pos==N+1||i==N+1) return; dp[i]=0;
for(int j=pos;j<=N;j++) if(dcmp(A[j][i])!=0){
swap(A[pos],A[j]); break;
}
if(dcmp(A[pos][i])!=0)
for(int j=pos+1;j<=N;j++){
double k=A[j][i]/A[pos][i];
for(int l=i;l<=N+1;l++)
A[j][l]-=k*A[pos][l];
}
Gausselimination(pos+(dcmp(A[pos][i]!=0)),i+1);
if(dcmp(A[pos][i])!=0){
for(int l=i+1;l<=N;l++)
dp[i]+=A[pos][l]*dp[l];
dp[i]=A[pos][N+1]-dp[i];
dp[i]=dp[i]/A[pos][i];
}
}
int main(){
ios::sync_with_stdio(0);
cin>>N>>M;
for(int i=1,u,v,w;i<=M;i++){
cin>>u>>v>>w;
E.Adde(u,v,w); cnt[u]++;
if(v!=u) E.Adde(v,u,w),cnt[v]++;
}
for(int i=30;i>=0;i--){
buildequation(i);
Gausselimination(1,1);
ANS=ANS*2+dp[1];
}
cout<<fixed<<setprecision(3)<<ANS<<endl;
return 0;
}
●BZOJ 2337 [HNOI2011]XOR和路径的更多相关文章
- 【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径
2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 682 Solved: 384[Submit][Stat ...
- BZOJ 2337: [HNOI2011]XOR和路径( 高斯消元 )
一位一位考虑异或结果, f(x)表示x->n异或值为1的概率, 列出式子然后高斯消元就行了 --------------------------------------------------- ...
- BZOJ 2337: [HNOI2011]XOR和路径 [高斯消元 概率DP]
2337: [HNOI2011]XOR和路径 题意:一个边权无向连通图,每次等概率走向相连的点,求1到n的边权期望异或和 这道题和之前做过的高斯消元解方程组DP的题目不一样的是要求期望异或和,期望之间 ...
- bzoj 2337: [HNOI2011]XOR和路径
Description Input Output Sample Input Sample Output HINT Source Day2 终于把这个史前遗留的坑给填了... 首先异或的话由位无关性,可 ...
- bzoj 2337 [HNOI2011]XOR和路径【高斯消元+dp】
首先,我们发现,因为是无向图,所以相连的点之间是有"依赖性"的,所以不能直接用dp求解. 因为是xor,所以按位处理,于是列线性方程组,设$ x[i] $为点i到n异或和为1的期望 ...
- BZOJ 2337 [HNOI2011]XOR和路径 ——期望DP
首先可以各位分开求和 定义$f(i)$表示从i到n的期望值,然后经过一些常识,发现$f(n)=1$的时候的转移,然后直接转移,也可以找到$f(n)=0$的转移. 然后高斯消元31次就可以了. #inc ...
- 【BZOJ 2337】 2337: [HNOI2011]XOR和路径(概率DP、高斯消元)
2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1170 Solved: 683 Description ...
- 【BZOJ】2337: [HNOI2011]XOR和路径 期望+高斯消元
[题意]给定n个点m条边的带边权无向连通图(有重边和自环),在每个点随机向周围走一步,求1到n的期望路径异或值.n<=100,wi<=10^9. [算法]期望+高斯消元 [题解]首先异或不 ...
- 2337:[HNOI2011]XOR和路径 - BZOJ
昨天才做了一道高斯消元,一下要精度判断,一下又不要精度判断 主要是思路很重要 很容易想到每一个二进制位算一个概率,然后求和,设f[i]为走到从i走到n这一个二进制位为1的概率 f[i]:=∑{f[j] ...
随机推荐
- 20155215 第二周测试1 与 myod
课堂测试 第一题 每个.c一个文件,每个 .h一个文件,文件名中最好有自己的学号 用Vi输入图中代码,并用gcc编译通过 在Vi中使用K查找printf的帮助文档 提交vi编辑过程截图,要全屏,包含自 ...
- django搭建web (四) models.py
demo 该demo模型主要是用于问题,选择单个或多个答案的问卷形式应用 # -*- coding: utf-8 -*- from __future__ import unicode_literals ...
- JAVAGUI设计步骤
①创建容器 首先要创建一个GUI应用程序,需要创建一个用于容纳所有其它GUI组件元素的载体,Java中称为容器.典型的包括窗口(Window).框架(Frame/JFrame).对话框(Dialog/ ...
- UIImage 内存细节
最近的一个项目,有大量的scrollView+imageView,当iPad启动较多程序,再启动自己的这个程序的时候,就爆内存退出了-- 后来把所有的生成图片的方法,全部由imageNamed改成了i ...
- raid5 / raid5e / raid5ee的性能对比及其数据恢复原理
RAID 5 是一种存储性能.数据安全和存储成本兼顾的存储解决方案. RAID 5可以理解为是RAID 0和RAID 1的折中方案.RAID 5可以为系统提供数据安全保障,但保障程度要比Mirror低 ...
- 不高兴的小名 nyoj
不高兴的小明 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 小明又出问题了.妈妈认为聪明的小明应该更加用功学习而变的更加厉害,所以小明除了上学之外,还要参加妈 ...
- webapi 使用Autofac 开发经历
2018/4/6 号 早上五点..被手机震动吵醒. 之后直接打开电脑,打算再加强下我自己的webapi这套东西. 虽然三年的工作经验接触了N多框架和各种风格的开发方式,但是让我自己来搞一套实在不会搞, ...
- mysql常用命令整理
#不压缩备份 mysqldump -u root -p userpassword databasename > /tmp/backupfile.sql #压缩备份 mysqldump -u ro ...
- jenkins简单安装及配置(Windows环境)
jenkins是一款跨平台的持续集成和持续交付.基于Java开发的开源软件,提供任务构建,持续集成监控的功能,可以使开发测试人员更方便的构建软件项目,提高工作效率. Windows平台下,一般安装方法 ...
- git出现错误原因解释
原因,在pull下拉代码或者push之前,你本地还有代码没有进行commit. 引起下面的错误. 建议commit后先pull再看看有没有冲突在进行push. git.exe push --pro ...