博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NOIP模拟题 管道
阅读量:5217 次
发布时间:2019-06-14

本文共 1280 字,大约阅读时间需要 4 分钟。

 

 

 

 题目大意

给定$n$个点的无向图,求它的$Dfs$序方案数

$n\leq 18$

 

题解

状压$Dp+$记忆化搜索。

$F_{i,now}$表示到达$i$其中$now$集合代表的点集已经遍历过,还需要遍历其余点的方案数。

考虑枚举$i$每一个不在点集内部的出边进行记忆化搜索转移。

这样会有一个问题:无法解决回溯。

考虑设$G_{i,now}$表示已选了点集$now$当前位置在$i$,能遍历到的所有最大状态,即当前情况下$i$的子树的集合与$now$的并集。

$G_{i,now}$也可以用记忆化搜索处理。

这样,对于每一个$F_{x,now}$,枚举每一个$\notin now$的$x$的后继$y$,

$$F_{x,now}=\sum F_{x,G_{y,now|y}}\times F_{y,now|y}$$

复杂度$O(n^2 2^n)$

#include
#define debug(x) cerr<<#x<<" = "<
=mod?x-mod:x)int Trans(int x,int now){ if(G[x][now]>=0) return G[x][now]; G[x][now]=now; for(int k=1;k<=sz[x];k++){ int to=c[x][k]; if((now>>(to-1))&1) continue; G[x][now]|=Trans(to,now|(1<<(to-1))); }return G[x][now];}int Dp(int x,int now){ if(Trans(x,now)==now) return 1; if(F[x][now]>=0) return F[x][now]; F[x][now]=0; for(int k=1;k<=sz[x];k++){ int to=c[x][k]; if((now>>(to-1))&1) continue; int t1=Dp(to,now|(1<<(to-1))); int t2=Dp(x,now|Trans(to,now|(1<<(to-1)))); int res=(LL)t1*(LL)t2%mod; upd(F[x][now],res); } return F[x][now];}int main(){ n=read(),m=read(),memset(G,-1,sizeof(G)),memset(F,-1,sizeof(F)); for(int i=1;i<=m;i++){int x=read(),y=read();c[x][++sz[x]]=y,c[y][++sz[y]]=x;} for(int i=1;i<=n;i++) upd(ans,Dp(i,1<<(i-1))); printf("%d\n",ans); return 0;}

转载于:https://www.cnblogs.com/OYJason/p/9908650.html

你可能感兴趣的文章
MongoDB遇到的疑似数据丢失的问题。不要用InsertMany!
查看>>
服务器被疑似挖矿程序植入107.174.47.156,发现以及解决过程(建议所有使用sonatype/nexus3镜像的用户清查一下)...
查看>>
JQuery 学习
查看>>
session token两种登陆方式
查看>>
C# ArrayList
查看>>
IntelliJ IDEA 12集成Tomcat 运行Web项目
查看>>
java,多线程实现
查看>>
个人作业4-alpha阶段个人总结
查看>>
android smack MultiUserChat.getHostedRooms( NullPointerException)
查看>>
递归-下楼梯
查看>>
实用的VMware虚拟机使用技巧十一例
查看>>
监控工具之---Prometheus 安装详解(三)
查看>>
Azure Iaas基础之---创建虚拟机
查看>>
不错的MVC文章
查看>>
网络管理相关函数
查看>>
IOS Google语音识别更新啦!!!
查看>>
20190422 T-SQL 触发器
查看>>
[置顶] Linux终端中使用上一命令减少键盘输入
查看>>
poj1422_有向图最小路径覆盖数
查看>>
BootScrap
查看>>