P3211-[HNOI2011]XOR和路径【高斯消元】
正题
题目链接:https://www.luogu.com.cn/problem/P3211
题目大意
一个\(n\)个点\(m\)条边的无向图,从\(1\)到\(n\)随机游走。求期望路径异或和。
\(2\leq n\leq 100,1\leq m\leq 10^4\)
解题思路
因为是异或的期望,很难直接处理,所以考虑按位考虑每一位是\(1\)的概率。
然后\(n\)很小就是一个很显然的高斯消元了。设\(f_i\)表示\(i\sim n\)是\(1\)的概率。
\]
时间复杂度\(O(n^3\log w_i)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110;
struct node{
int to,next,w;
}a[N*N*2];
int n,m,tot,deg[N],ls[N];
double f[N],ans;
void addl(int x,int y,int w){
a[++tot].to=y;
a[tot].next=ls[x];
ls[x]=tot;a[tot].w=w;
return;
}
namespace G{
double a[N][N],b[N];
void init(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)a[i][j]=0;
b[i]=0;
}
return;
}
void solve(double *f){
for(int i=1;i<=n;i++){
int z=i;
for(int j=i+1;j<=n;j++)
if(a[j][i]>a[z][i])z=i;
swap(a[i],a[z]);swap(b[i],b[z]);
double inv=a[i][i];
for(int j=i;j<=n;j++)
a[i][j]=a[i][j]/inv;
b[i]=b[i]/inv;
for(int j=i+1;j<=n;j++){
double rate=-a[j][i];
for(int k=i;k<=n;k++)
a[j][k]+=a[i][k]*rate;
b[j]+=b[i]*rate;
}
}
for(int i=n-1;i>=1;i--){
for(int j=i+1;j<=n;j++)
b[i]-=b[j]*a[i][j]/a[j][j];
f[i]=b[i];
}
return;
}
};
void solve(int w){
G::init();G::a[n][n]=1;
for(int x=1;x<n;x++){
for(int i=ls[x];i;i=a[i].next){
int y=a[i].to;
if(a[i].w&w)G::a[x][y]++,G::b[x]++;
else G::a[x][y]--;
}
G::a[x][x]+=deg[x];
}
G::solve(f);ans+=(double)w*f[1];
return;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
deg[x]++;addl(x,y,w);
if(x!=y)deg[y]++,addl(y,x,w);
}
for(int i=0;i<=30;i++)
solve(1<<i);
printf("%.3lf\n",ans);
return 0;
}
P3211-[HNOI2011]XOR和路径【高斯消元】的更多相关文章
- BZOJ 2337: [HNOI2011]XOR和路径( 高斯消元 )
一位一位考虑异或结果, f(x)表示x->n异或值为1的概率, 列出式子然后高斯消元就行了 --------------------------------------------------- ...
- BZOJ 2337: [HNOI2011]XOR和路径 [高斯消元 概率DP]
2337: [HNOI2011]XOR和路径 题意:一个边权无向连通图,每次等概率走向相连的点,求1到n的边权期望异或和 这道题和之前做过的高斯消元解方程组DP的题目不一样的是要求期望异或和,期望之间 ...
- BZOJ2337:[HNOI2011]XOR和路径(高斯消元)
Description 给定一个无向连通图,其节点编号为 1 到 N,其边的权值为非负整数.试求出一条从 1 号节点到 N 号节点的路径,使得该路径上经过的边的权值的“XOR 和”最大.该路径可以重复 ...
- BZOJ2337: [HNOI2011]XOR和路径(高斯消元,期望)
解题思路: Xor的期望???怕你不是在逗我. 按为期望,新技能get 剩下的就是游走了. 代码: #include<cmath> #include<cstdio> #incl ...
- BZOJ 2337 XOR和路径 | 高斯消元 期望 位运算
BZOJ 2337 XOR和路径 题解 这道题和游走那道题很像,但又不是完全相同. 因为异或,所以我们考虑拆位,分别考虑每一位: 设x[u]是从点u出发.到达点n时这一位异或和是1的概率. 对于所有这 ...
- 【BZOJ2337】XOR和路径(高斯消元)
题目链接 大意 给出\(N\)个点,\(M\)条边的一张图,其中每条边都有一个非负整数边权. 一个人从1号点出发,在与该点相连的边中等概率的选择一条游走,直到走到\(N\)号点. 问:将这条路径上的边 ...
- bzoj2337 XOR和路径——高斯消元
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2337 异或就一位一位考虑: x为到n的概率,解方程组即可: 考虑了n就各种蜜汁错误,所以索性 ...
- 洛谷P3211 [HNOI2011]XOR和路径(期望dp+高斯消元)
传送门 高斯消元还是一如既往的难打……板子都背不来……Kelin大佬太强啦 不知道大佬们是怎么发现可以按位考虑贡献,求出每一位是$1$的概率 然后设$f[u]$表示$u->n$的路径上这一位为$ ...
- 【bzoj2115】[Wc2011] Xor DFS树+高斯消元求线性基
题目描述 输入 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边. 图 ...
- P3211 [HNOI2011]XOR和路径
思路 看到异或,容易联想到二进制位之间是相互独立的,所以可以把问题变成每个二进制位为1的概率再乘上(1<<pos)的值 假设现在考虑到pos位,设f[i]为第i个节点期望的异或和第pos位 ...
随机推荐
- wpf 获得exe的运行路径
System.Reflection.Assembly.GetEntryAssembly().Location
- Mysql 之 IFNULL(expr1,expr2) 对空不可判
目标 当传入参数 @OrderId为空时 不做过滤 sql语句如下 SELECT o.* FROM `order` AS o LEFT JOIN receivemoneyconfirm AS re O ...
- LeetCoded第21题题解--合并两个有序链表
21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出 ...
- jQuery中的层级选择器(四、二):后代元素、子元素、相邻元素、兄弟元素
<!DOCTYPE html> <html> <head> <title>层次选择器</title> <meta http-equiv ...
- 分布式协调组件Zookeeper之 选举机制与ZAB协议
Zookeeper简介: Zookeeper是什么: Zookeeper 是⼀个分布式协调服务的开源框架. 主要⽤来解决分布式集群中应⽤系统的⼀致性问题, 例如怎样避免同时操作同⼀数据造成脏读的问题. ...
- 整型:int
整型:int 整型变量的定义和输出 注意://short<=int<=long<=longlong 代码示例一: #include<stdio.h> int ma ...
- GUI编程路线
基本路线
- Linux下SSH以及SSH秘钥
一.基于秘钥方式实现远程连接 第一步:创建密钥对(在管理端服务器上操作) 中间的输入项可以直接回车 ssh-keygen -t dsa 第二步:分发公钥(在管理端服务器执行) 这个步骤需要输入一个ye ...
- ubuntu下使用minicom
环境 宿主机平台:Ubuntu 16.04.6 目标机:iMX6ULL 安装及使用 首先时在Ubuntu里安装minicom sudo apt-get install minicom 接下来可以使用 ...
- app自动化定位:UIautomation的用法
UIautomation定位的优点: 速度比xpath定位快,UIautomation是Android的工作引擎 缺点: 没有idea提示 UIautomation使用方法: AndroidDrive ...