【BZOJ2576】[JSOI2011]序的计数 (动态规划)

题面

BZOJ

题解

首先构建一个新的虚拟节点连接所有目标节点,强行将其作为第一个被访问的节点,这样子就解决了图不连通的问题。

除了目标节点外,所有其他点都可以缩成一个节点。

这样子的图实际上只有\(k+2\)个节点,\(k+1\)个目标节点。

预处理\(G[S][u]\)表示已经在\(dfs\)序中出现过的点的集合为\(S\),当前在点\(u\)能够访问到的点。

设\(f[S][u]\)表示当前在点\(u\),已经确定\(dfs\)序的集合为\(S\)的\(dfs\)序的方案数。

注意如果一个点和不合法的点有连边,那么这个点不能回朔。

转移的时候枚举一个\(u\)的相邻点,记忆化搜索即可。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ll long long
#define MAX 120
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,m,K,id[MAX],S[20];
bool g[MAX][MAX],M[20][20];
ll f[1<<19][20];
int G[1<<19][20];
int dfs(int u,int S)
{
if(~G[S][u])return G[S][u];
int ret=1<<u;
for(int i=0;i<K;++i)
if(M[u][i]&&!(S&(1<<i)))ret|=dfs(i,S|(1<<i));
return G[S][u]=ret;
}
ll Solve(int u,int S)
{
if(~f[S][u])return f[S][u];
if(G[S][u]==1<<u)return S==(1<<K)-1||!M[u][K];
ll ret=0;
for(int i=0;i<K;++i)
if(M[u][i]&&!(S&(1<<i)))
ret+=Solve(i,S|(1<<i))*Solve(u,S|G[S|(1<<i)][i]);
return f[S][u]=ret;
}
int main()
{
n=read();m=read();K=read();K+=1;
for(int i=1,u,v;i<=m;++i)u=read(),v=read(),g[u][v]=g[v][u]=1;
for(int i=1;i<=n;++i)id[i]=K;
for(int i=0;i<K-1;++i)S[i]=read(),id[S[i]]=i,M[i][K-1]=M[K-1][i]=1;
for(int i=0;i<=K;++i)
for(int j=1;j<=n;++j)M[i][id[j]]|=g[S[i]][j];
memset(G,-1,sizeof(G));memset(f,-1,sizeof(f));
for(int i=0;i<(1<<K);++i)
for(int j=0;j<K;++j)
if(i&(1<<j))dfs(j,i);
printf("%lld\n",Solve(K-1,1<<(K-1)));
return 0;
}

最新文章

  1. localstorage 和 sessionstorage 本地存储
  2. 简单java在线测评程序
  3. [转]spring 注入静态变量
  4. myeclipse报错: java compiler level does not match the version of the installed java project facet
  5. 并行计算之Memory barrier(内存
  6. C# 中 static 的用法
  7. powershell里添加对git的支持
  8. 基于ThinkPHP框架的简单的后台管理系统
  9. NativeScript官方书籍:NativeScript-用你现有技术构建移动应用程序
  10. Java-Integer源码分析
  11. 基于docker 如何部署surging分布式微服务引擎
  12. 利用Navicat高效率postgresql转mysql数据库
  13. SpringBoot报错:Failed to load ApplicationContext(Mapped Statements collection already contains value)
  14. dubbo负载均衡与集群集群容错
  15. Spring boot+CXF开发WebService Demo
  16. 并发之lock的condition接口
  17. spring 的 ApplicationContext.getBean(type) 无法获取bean,报错
  18. MVC的项目部署成应用程序或虚拟目录路径的问题
  19. exec系列函数和system函数
  20. Java:多线程,线程池,用Executors静态工厂生成常用线程池

热门文章

  1. Podfile文件用法详解
  2. net core 小坑杂记之配置文件读取(不定期更新)
  3. sqlserver2008 传入的表格格式数据流(tds)协议流不正确。
  4. CodeForces Round #550 Div.3
  5. js根据ip自动获取地址(省市区)
  6. github 操作
  7. unsupported time zone specified undefined
  8. mysql 清除大数据表单
  9. Python:matplotlib绘制线条图
  10. Python 常用模块总结