f[i][j]: i表示整个图走没走过的状态 j表示当前到了第j个点 存的值就是在这种情形下 可以走到的地方的状态

dp[i][j]:i表示整个图走没走过的状态 j表示当前在j点 访问剩余能去到的点的方案数

因此只需要跑一遍DFS就好了

#include<bits/stdc++.h>
#define int long long
#define mod 998244353
#define N 19
#define M 400
using namespace std;
int n,m,first[N],tot;
int f[1<<N][N],dp[1<<N][N];
struct node
{int to,next;
}edge[2*M];
inline void addedge(int x,int y)
{tot++;edge[tot].to=y;edge[tot].next=first[x];first[x]=tot;
}
int dfs1(int sta,int now)
{if(f[sta][now]) return f[sta][now];f[sta][now]=sta;    //sta一定是f[sta][now]的子集 for(int u=first[now];u;u=edge[u].next){int vis=edge[u].to;if(!(sta&(1<<vis))) //这个点没有走过 {f[sta][now]|=dfs1(sta|(1<<vis),vis); //要"并"进去 }}return f[sta][now];
}
int dfs2(int sta,int now)
{if(f[sta][now]==sta)    return 1;if(dp[sta][now]!=-1)    return dp[sta][now];dp[sta][now]=0;for(int u=first[now];u;u=edge[u].next){int vis=edge[u].to;if(sta&(1<<vis))    continue;int x=dfs2(sta|(1<<vis),vis);int y=dfs2(f[sta|(1<<vis)][vis],now);dp[sta][now]+=x*y%mod;}return dp[sta][now]%=mod;
}
main()
{ios::sync_with_stdio(false);cin.tie(NULL);  cout.tie(NULL);cin>>n>>m;for(int i=1;i<=m;i++){int x,y;cin>>x>>y;x--;y--;addedge(x,y);addedge(y,x);}for(int i=0;i<(1<<n);i++){for(int j=0;j<n;j++){if(i&(1<<j)){f[i][j]=dfs1(i,j);   } }}memset(dp,-1,sizeof(dp));int ans=0;for(int i=0;i<n;i++){ans=(ans+dfs2(1<<i,i))%mod;}cout<<ans%mod;return 0;
}

转载于:https://www.cnblogs.com/Patrickpwq/articles/9805795.html

【NOIP模拟】T2 管道(状压dp求图的dfs序方案数)相关推荐

  1. CodeForces 11D(状压DP 求图中环的个数)

    Given a simple graph, output the number of simple cycles in it. A simple cycle is a cycle with no re ...

  2. 第九届河南省赛 宣传墙 //状压dp+矩阵快速幂+dfs

    http://nyoj.top/problem/1273 状压dp+矩阵快速幂+dfs 1273-宣传墙 内存限制:64MB 时间限制:1000ms 特判: No 通过数:19 提交数:64 难度:4 ...

  3. NCD 2019题解C. Hasan and his lazy students【dp求lis,顺序维护方案数】

    题目链接 题意,给序列,求最长上升子序列长度和方案数. n<=1000,因为n小于1e3,所以可以使用复杂度为n2的dp做法,然后使用一个结构体来维护方案数就行了: 先定义一个结构体,包含dp求 ...

  4. UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)

    整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...

  5. BZOJ 4042 Luogu P4757 [CERC2014]Parades (树形DP、状压DP)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4042 (Luogu) https://www.luogu.org/prob ...

  6. 【vijos P1914】【codevs 3904】[NOIP2014 普及组T4]子矩阵(dfs+状压dp)

    P1914子矩阵 Accepted 标签:NOIP普及组2014[显示标签] 描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与 列的相对顺序)被称为原矩阵 ...

  7. BZOJ 1087 SCOI2005 互不侵犯King 状压DP

    题目大意:给定n*n的国际象棋棋盘.在上面放k个国王,要求国王之间互不攻击.求方案数 n<=⑨ 状压DP.将每一行的方案二进制压成一维,令f[i][j][k]为第i行用去j个国王状态为k的方案数 ...

  8. 【LDU】 Week2自测 Disney‘s FastPass | 状压dp、Floyd

    这题是hdu 4114... 跟着19的打了打周测,发现个好题 写了写还wa了一发 题目大意: 给出n个点,k个要旅游的景点,然后给出k个景点的信息(位置,t,ft,门票所在地点),t于ft表示,如果 ...

  9. QDUOJ 来自xjy的签到题(bfs+状压dp)

    来自xjy的签到题 Description 爱丽丝冒险来到了红皇后一个n*n大小的花园,每个格子由'.'或'#'表示,'.'表示爱丽丝可以到达这个格子,'#'表示爱丽丝不能到达这个格子,爱丽丝每1分钟 ...

最新文章

  1. 不支持打开非业务域名htts:....请重新配置
  2. 2019如何学Python?这里有你需要的答案
  3. 计算机网络实验指导书实验报告,计算机网络实验一 熟悉常用的网络命令实验报告模板...
  4. 30 秒裁剪的很大一部分作用是观察什么对别人是重要的
  5. Linux编程(7)_gdb
  6. 军事卫星行业调研报告 - 市场现状分析与发展前景预测
  7. 第三章 Docker 入门
  8. zotero中pdf-translate插件的使用
  9. 文件系统 83 linux,Linux文件系统
  10. 华为U2000北向接口开发中遇到的坑——获取HW_MSTPInventory管理对象失败
  11. 博士申请 | 阿尔伯塔大学招收人工智能方向全奖博士生、硕士生
  12. Python:Numpy—rand、randn
  13. 基于Rust-vmm实现Kubernetes运行时
  14. 深入浅出WMS之出库流程解析
  15. DataGrip下载安装及使用教程(详细版)
  16. Firefox迅雷组件导致a标签进行两次请求提交
  17. Atitit 最近资料文章列表r9 r8 月份 attilax总结
  18. SQLite 3.39.0 发布,支持右外连接和全外连接
  19. 关于INS-30131
  20. js+css让背景图片动起来

热门文章

  1. C语言文本操作以及C语言小技巧
  2. JAVA 编写程序实现如下功能:一个线程进行如下运算1*2+2*3+3*4+……+19*20,而另一个线程则每隔一段时间读取前一个线程的运算结果。
  3. 设计模式使用率排行榜
  4. 23种设计模式及OOP7大原则
  5. QT读取Word文档
  6. 【译】Secure Computations as Dataflow Programs Implementing the SPDZ Protocol using TensorFlow
  7. TensorFlow for Hackers (Part VII) - Credit Card Fraud Detection using Autoencoders in Keras
  8. 【源码解读】Screencap源码分析-基础篇
  9. AS编写sdk并打成jar包供其它APP调用
  10. Android进程使用Messenger通信