Luogu P4321 随机漫游
期望DP要倒着推
题意
不一定是树,询问点不一定均为1
$Solution$
设计一个巧妙的DP状态
设$ F(S,x)$表示当前在点$ x$已经走遍了$ S$,走完剩下所有点的期望步数
这样推转移$ DP$的时候一定是从$ F(S|y,y)$转移过来
容易发现$ S|y$->$S$是不可能会变大的,即这维不可能成环
因此从大到小枚举$ S$,对当前$ S$,显然比$ S$大的状态已经被计算,暴力$ n^3$高斯消元消出这维就好了
时间复杂度$ O(2·n·n^3)$
但
为什么不直接$ Min-Max$容斥呢
每次枚举$ S$消出当前$ Min(S,x)$中的x这维
复杂度不变
而且很好写啊...
$ my \ code$
#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#define p 998244353
#define rt register int
#define ll long long
using namespace std;
inline ll read(){
ll x=;char zf=;char ch=getchar();
while(ch!='-'&&!isdigit(ch))ch=getchar();
if(ch=='-')zf=-,ch=getchar();
while(isdigit(ch))x=x*+ch-'',ch=getchar();return x*zf;
}
void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
void writeln(const ll y){write(y);putchar('\n');}
int k,m,n,x,y,z,cnt,S;
bool link[][];int a[][],d[];
int inv[],ans[][<<];
int ksm(int x,int y=p-){
int ans=;
for(rt i=y;i;i>>=,x=1ll*x*x%p)if(i&)ans=1ll*ans*x%p;
return ans;
}
void gauss(){
for(rt i=;i<=n;i++)if(!(S>>i-&)){
for(rt j=i;j<=n;j++)if(a[j][i]){
if(j!=i)for(rt k=;k<=n+;k++)swap(a[i][k],a[j][k]);
break;
}
if(!a[i][i])continue;
inv[i]=ksm(a[i][i]);
for(rt j=i+;j<=n;j++)if(a[j][i]){
const int x=1ll*a[j][i]*inv[i]%p;
for(rt k=i;k<=n+;k++)if(a[i][k])(a[j][k]-=1ll*a[i][k]*x%p)%=p;
}
}
for(rt i=n;i>=;i--)if(!(S>>i-&)){
ans[i][S]=1ll*a[i][n+]*inv[i]%p;
for(rt j=i-;j>=;j--)if(a[j][i])(a[j][n+]-=1ll*ans[i][S]*a[j][i]%p)%=p;
}
}
int ret[][<<];
int main(){
n=read();m=read();
for(rt i=;i<=m;i++){
x=read();y=read();d[x]++;d[y]++;
link[x][y]=link[y][x]=;
}
//Max(S)走遍集合S的时间
//Min(S)第一次走到S的时间
for(S=;S<(<<n);S++){
memset(a,,sizeof(a));
for(rt i=;i<=n;i++){
if(S>>i-&)a[i][i]=;
else {
for(rt j=;j<=n;j++)if(link[i][j]&&!(S>>j-&))a[i][j]=-;
a[i][i]=d[i];a[i][n+]+=d[i];
}
}
gauss();
}
//Max(S)=sigma Min(T) (-1)|T|+1
for(rt i=;i<=n;i++){
for(rt j=;j<(<<n);j++)if(!(__builtin_popcount(j)&))ans[i][j]*=-;
for(rt j=;j<n;j++)
for(rt k=;k<(<<n);k++)if(k>>j&)(ans[i][k]+=ans[i][k^(<<j)])%=p;
}
for(rt T=read();T;T--){
n=read();S=;
for(rt i=;i<=n;i++)S|=(<<read()-);
x=read();writeln((ans[x][S]+p)%p);
}
return ;
}
Luogu P4321 随机漫游的更多相关文章
- luogu P4321 随机漫游 期望dp 二进制 高斯消元
LINK:随机漫游 非常妙的一道题. 容易想到倒推期望. 设状态 f[i][j]表示到达第i个点 此时已经到达的集合为j能走到全集的期望边数. 只要求出来这个就能O(1)回答询问. \(f[i][j] ...
- 洛谷 P4321 【随机漫游】
题目大意 给出\(n(n\leq 18)\)个点的无向连通图,\(m(m\leq 10^5)\)次询问.每次询问给出一个点集和一个起点\(s\),询问从\(s\)出发,经过这个点集中的每一个点至少一次 ...
- BZOJ 1180 [CROATIAN 2009]OTOCI // BZOJ 2843 极地旅行社 // Luogu P4321 [COCI 2009] OTOCI / 极地旅行社 (LCA板题)
emmm-标题卡着长度上限- LCT板题-(ε=ε=ε=┏(゜ロ゜;)┛) CODE #include <cctype> #include <cmath> #include & ...
- 快速构建Windows 8风格应用27-漫游应用数据
原文:快速构建Windows 8风格应用27-漫游应用数据 本篇博文主要介绍漫游应用数据概览.如何构建漫游应用数据.构建漫游应用数据最佳实践. 一.漫游应用数据概览 1.若应用当中使用了漫游应用数据, ...
- UWP开发:应用文件存储
应用设置由于数据量和数据类型的限制,有很大的局限性,所以还需要应用文件存储,以文件的方式存储数据.在每个应用的应用数据存储中,该应用拥有系统定义的根目录:一个用于本地文件,一个用于漫游文件,还有一个用 ...
- Python编程:从入门到实践 - matplotlib篇 - Random Flow
随机漫游 # random_flow.py 随机漫游 import random class RandomFlow(): """一个生成随机漫游数据的类"&qu ...
- UE4蓝图AI角色制作(三)
接上一节 6. 寻路网格体代理 通过允许配置多个"代理",虚幻引擎使得用户能够轻松为大小各异的AI创建寻路网格体.首先,选中世界大纲视图中的"RecastNavMesh& ...
- UE4蓝图AI角色制作(六)之行为树
13.行为树原理 AI最重要的环节就是行为树.我们将解释什么是行为树.为何它如此重要,以及构建行为树需要哪些元素. 借助行为树,我们可以轻松控制并显示AI的决策制定过程.行为树是一种将AI在场景中的决 ...
- UE4蓝图AI角色制作(七)之追逐玩家
15.追逐玩家 现在我们的AI无法做出任何决策,它总是执行相同的决策.我们先把感知系统中的相关信息提供给AI,让AI知道如何做出决策,然后我们会修改行为树.我们首先需要创建新的黑板键,这样我们就能在行 ...
随机推荐
- SQL ALTER TABLE 语句
ALTER TABLE 语句 ALTER TABLE 语句用于在已有的表中添加.修改或删除列. SQL ALTER TABLE 语法 如需在表中添加列,请使用下列语法: ALTER TABLE tab ...
- VMware Workstation中安装linux系统(CentOS)超详细(部分转载)
首先准备一下VMware虚拟机和linux镜像文件,链接如下: 对于32位windows机子安装的是10.0.7版本的VMware Workstation,链接: https://pan.baidu. ...
- Linux系统中常见的目录名称以及相应内容
目录名称 应放置文件的内容 /boot 开机所需文件——内核.开机菜单以及所需配置文件等等 /dev 以文件形式存放任何设备与接口 /etc 配置文件 /home 用户家目录 /bin 存放单用户模式 ...
- 012_call和apply区别
一. function fn(a,b) { console.log(this); } fn.call(null,1,2); //call为参数方式 fn.apply(null,[1,2]); //ap ...
- 26 python 初学(线程、同步锁、死锁和递归锁)
参考博客: www.cnblogs.com/yuanchenqi/articles/5733873.html 并发:一段时间内做一些事情 并行:同时做多件事情 线程是操作系统能够进行运算调度的基本单位 ...
- Java面试准备之探究源码
摘要:之前虽然对集合框架一些知识点作了总结,但是想想面试可能会问源码,于是又大致研究了一下集合框架的一些实现类的源码,在此整理一下. 一.集合框架 二.深究实现类 1.ArrayList源码实现 Ar ...
- Mysql_连接字符串
1.本地数据库连接 <connectionStrings> <add name="ConnectionString" connectionString=" ...
- PS对街拍女孩照片增加质感
看到原图时,我的内心是抗拒的,灰蒙蒙毫无质感可言,手机app大概都拍得比这好看(捂脸笑哭). 大概是因为偏背光,光线暧昧不够强烈,且50 1.4这只镜头锐度还欠佳的缘故.所以平时3天修完图的我,这次拖 ...
- 原生Ajax XMLHttpRequest对象
一.Ajax请求 - 现在常见的前后端分离项目中,一般都是服务器返回静态页面后浏览器加载完页面,运行script中的js代码,通过ajax向后端api发送异步请求获取数据,然后调用回调函数,将数据添加 ...
- 【学习总结】GirlsInAI ML-diary day-10-if条件执行
[学习总结]GirlsInAI ML-diary 总 原博github链接-day10 认识if条件执行 一般条件执行 分支执行 链式条件执行 嵌套条件执行 1-if一般条件执行 格式:如果(满足这个 ...