思路不难想,细节比较多。

思路

观察到 \(n \le 19\) ,首先想到状压 dp 。

于是自然地定义 \(dp[j][i]\) 为:抵达点的状态为 \(i\) ,且此时在点 \(j\) 时,简单路径的条数。注意这里是简单路径的条数,而不是环的个数,因为环的个数要在 dp 过程中统计。这里的 dp 作用就在于求简单路径条数

在转移的时候,我们先定下当前状态 \(i\) ,然后选定当前处于哪个点 \(j\) ,最后决定去到哪个点 \(k\) 。与一般的吃奶酪模型不太一样,\(k\) 可以不在 \(i\) 中。

对于 \(k\) 在 \(i\) 中且 \(k\) 为起点的情况,此时重复抵达一个点,这时候我们找到了环,则 \(ans+=dp[j][i]\) 。

对于 \(k\) 不在 \(i\) 中的情况,就要去到 \(k\) 那里,则 \(dp[k][i|(1<<k)]+=dp[j][i]\) 。

因为起点不同,经过的边相同的环视为同一个环,所以我们假定起点为当前状态的 lowbit ,注意在枚举 \(k\) 时我们不能让 \((1<<k)<lowbit(i)\) ,因为如果这样那么我们的起点就改变了,会统计到重复的。

另外,因为我们会把所有的无向边统计进去,所以我们的 \(ans-m\) 。又因为一条环会正着走一遍,反着走一遍,所以要把 \((ans-m)/2\) ,即为最终结果。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
bool g[55][55];
ll dp[20][600000],ans=0;
int lowbit(int x){return x&-x;}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
u--,v--;
g[u][v]=g[v][u]=1;
}
for(int i=0;i<n;i++)dp[i][1<<i]=1;
for(int i=0;i<(1<<n);i++)
{
for(int j=0;j<n;j++)
{
if(((i>>j)&1)==0)continue;
for(int k=0;k<n;k++)
{
if(!g[j][k]||j==k)continue;
if(lowbit(i)>(1<<k))continue;// 一定要加特判,防止起点变化
if((i>>k)&1)
{
if(lowbit(i)==(1<<k))ans+=dp[j][i];
}
else dp[k][i|(1<<k)]+=dp[j][i];
}
}
}
cout<<(ans-m)/2;
return 0;
}

Codeforces 11D A Simple Task 题解 [ 蓝 ] [ 状压 dp ]的更多相关文章

  1. Educational Codeforces Round 13 E. Another Sith Tournament 状压dp

    E. Another Sith Tournament 题目连接: http://www.codeforces.com/contest/678/problem/E Description The rul ...

  2. CodeForces - 11D A Simple Task

    Discription Given a simple graph, output the number of simple cycles in it. A simple cycle is a cycl ...

  3. Codeforces Gym 100610 Problem K. Kitchen Robot 状压DP

    Problem K. Kitchen Robot Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10061 ...

  4. bzoj 2669 题解(状压dp+搜索+容斥原理)

    这题太难了...看了30篇题解才整明白到底咋回事... 核心思想:状压dp+搜索+容斥 首先我们分析一下,对于一个4*7的棋盘,低点的个数至多只有8个(可以数一数) 这样的话,我们可以进行一个状压,把 ...

  5. FZU - 2218 Simple String Problem(状压dp)

    Simple String Problem Recently, you have found your interest in string theory. Here is an interestin ...

  6. Codeforces 1225G - To Make 1(bitset+状压 dp+找性质)

    Codeforces 题目传送门 & 洛谷题目传送门 还是做题做太少了啊--碰到这种题一点感觉都没有-- 首先我们来证明一件事情,那就是存在一种合并方式 \(\Leftrightarrow\) ...

  7. BZOJ 1087 题解【状压DP】

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3112  Solved: 1816[Submit][ ...

  8. noi省选 [九省联考2018]一双木棋题解(状压dp)

    比浙江简单多了........ 题目转送:https://www.luogu.org/problemnew/show/P4363 分析: 我们注意到n和m都很小,考虑一下状压dp. 显然,棋子摆成的形 ...

  9. 【NOIP2017】宝藏 题解(状压DP)

    题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 nnn 个深埋在地下的宝藏屋, 也给出了这 nnn 个宝藏屋之间可供开发的m mm 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中 ...

  10. LibreOJ 6177 题解(状压DP)

    题面 传送门 分析 刚看到这道题时想的是跟最短哈密顿路类似的二进制状压DP,先用floyd处理距离 但是此题用二进制不够,应该用三进制 0,1,2分别表示未送,正在送,已送完 dp[s][i]表示当前 ...

随机推荐

  1. 简述GoLang优势与生态

    开门见山,一睹golang的风采 性能优势 部署运维成本低 编码格式统一:测试简单 1. 性能优势 Go 语言被称为是:"21世纪的C语言",虽然这个帽子戴的有点高,不妨这里给大家 ...

  2. MySQL底层概述—7.优化原则及慢查询

    大纲 1.Explain概述 2.Explain详解 3.索引优化数据准备 4.索引优化原则详解 5.慢查询设置与测试 6.慢查询SQL优化思路 1.Explain概述 使用Explain关键字可以模 ...

  3. Go 内存管理

    操作系统内存管理 操作系统管理内存的存储单元是页(page),在 linux 中一般是 4KB.而且,操作系统还会使用 虚拟内存 来管理内存,在用户程序中,我们看到的内存是不是真实的内存,而是虚拟内存 ...

  4. 1.mysql部署文档

    部署方式 1.docker上面部署 ● 部署最新版本 docker pull mysql:latest # 拉取最新版本的镜像文件 docker images # 查看已经安装的镜像文件 docker ...

  5. PDFSharp - Graphics 绘制接口

    PDFSharp - Graphics Graphics - PDFsharp and MigraDoc Wiki 所有的 Graphics 类型都设计成模仿来自 System.Drawing 命名空 ...

  6. 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-8- 元素高级定位技巧(详细教程)

    1.简介 随着网页的复杂性和动态性的增加,自动化测试变得越来越重要.Playwright作为一款强大的无头浏览器测试库,提供了多种元素定位方式,使得我们能够轻松地对网页进行自动化操作.在基础的定位方式 ...

  7. alpine-jdk17

    # 指定基础镜像 FROM amd64/eclipse-temurin:17.0.5_8-jdk-alpine MAINTAINER "muzhi" RUN sed -i 's/d ...

  8. Qt视频监控系统一个诡异问题的解决思路(做梦都想不到)

    一.前言 由于Qt版本众多,几百个版本之间存在不兼容的情况,为此如果要兼容很多版本,没有取巧的办法和特殊的捷径,必须自己亲自安装各个版本编译运行并测试,大问题一般不会有,除非缺少模块,小问题还是不断有 ...

  9. Qt编写项目作品27-多线程文件传输

    一.功能特点 多线程收发文件,支持加密传输. 接收端支持监听端口接收文件和主动连接服务器接收文件两种方式. 按照 文件开始符+文件大小+文件内容+文件结束符 逐个分包接收. 可对接收的加密过的文件包进 ...

  10. [转]java调用python脚本以及通过Process.waitFor()直接调用python模块返回错误代码1的一种解决办法

    常见的java调用python脚本方式 通过jython提供的类库实现 通过Runtime.getRuntime()开启进程来执行脚本文件 通过jython提供的类库实现 通过jython实现的话,我 ...