Codeforces 11D A Simple Task 题解 [ 蓝 ] [ 状压 dp ]
思路不难想,细节比较多。
思路
观察到 \(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 ]的更多相关文章
- Educational Codeforces Round 13 E. Another Sith Tournament 状压dp
E. Another Sith Tournament 题目连接: http://www.codeforces.com/contest/678/problem/E Description The rul ...
- CodeForces - 11D A Simple Task
Discription Given a simple graph, output the number of simple cycles in it. A simple cycle is a cycl ...
- 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 ...
- bzoj 2669 题解(状压dp+搜索+容斥原理)
这题太难了...看了30篇题解才整明白到底咋回事... 核心思想:状压dp+搜索+容斥 首先我们分析一下,对于一个4*7的棋盘,低点的个数至多只有8个(可以数一数) 这样的话,我们可以进行一个状压,把 ...
- FZU - 2218 Simple String Problem(状压dp)
Simple String Problem Recently, you have found your interest in string theory. Here is an interestin ...
- Codeforces 1225G - To Make 1(bitset+状压 dp+找性质)
Codeforces 题目传送门 & 洛谷题目传送门 还是做题做太少了啊--碰到这种题一点感觉都没有-- 首先我们来证明一件事情,那就是存在一种合并方式 \(\Leftrightarrow\) ...
- BZOJ 1087 题解【状压DP】
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3112 Solved: 1816[Submit][ ...
- noi省选 [九省联考2018]一双木棋题解(状压dp)
比浙江简单多了........ 题目转送:https://www.luogu.org/problemnew/show/P4363 分析: 我们注意到n和m都很小,考虑一下状压dp. 显然,棋子摆成的形 ...
- 【NOIP2017】宝藏 题解(状压DP)
题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 nnn 个深埋在地下的宝藏屋, 也给出了这 nnn 个宝藏屋之间可供开发的m mm 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中 ...
- LibreOJ 6177 题解(状压DP)
题面 传送门 分析 刚看到这道题时想的是跟最短哈密顿路类似的二进制状压DP,先用floyd处理距离 但是此题用二进制不够,应该用三进制 0,1,2分别表示未送,正在送,已送完 dp[s][i]表示当前 ...
随机推荐
- 2023CCCC选拔赛
7-7 与零交换 给定排列\(p:0,1,2...n-1\),每次操作你只能将一个数字和\(0\)进行交换,然后将初始排列升序排列,请你找出最少的与\(0\)交换的次数 题解:思维 + 环 样例一: ...
- 实现不可逆加密文件:探索 GodoOS 的安全机制
在当今数字化时代,数据安全成为了企业和个人关注的重点.为了保护敏感信息不被未授权访问,各种加密技术应运而生.本文将探讨 GodoOS 项目中实现的一种不可逆加密文件的方法,重点介绍其背后的原理和技术细 ...
- Java框架 —— MyBatis
MyBatis 简介 持久层框架,半自动映射,支持自定义SQL.高级映射.存储过程,免除了JDBC代码.参数设置.获取结果集的工 作,可以通过XML或注解方式配置.映射接口,以及实体类在数据库中的记 ...
- AE对象序列化
当我们编写AE程序时,通常会遇到需要存储某个AE对象的情况,比如Layer,Element,Map,Legend,NorthArrow等等这些.举个例子说明一下:在我们编辑Featurelayer时, ...
- docker compose的安装
1,安装docker ### CentOS8 默认是会读取centos.org的mirrorlist的,所以一般来说是不需要配置镜像的. # step 1: 安装必要的一些系统工具 sudo yum ...
- Electron 窗体 BrowserWindow
http://jsrun.net/t/KfkKp https://www.wenjiangs.com/doc/tlsizw1dst https://www.w3cschool.cn/electronm ...
- Halo博客+兰空图床搭建保姆级指南
1. 简介 1.1 依赖的相关软件 Docker.Docker-Compose底层运行环境 Minio底层的存储支持 Mysql关系型数据库 Redis缓存中间件 NginxProxyManager( ...
- Eclipse中如何将web应用部署到tomcat
第1种方法: 将workspace下的复制到tomcat的webapp下(我看度还是算了,看着都觉得麻烦). 第2种方法:总体思路就是:(1)先为web应用创建Tomcat Server:(2)再将w ...
- 【狂神说Java】Java零基础学习笔记-Java数组
[狂神说Java]Java零基础学习笔记-Java数组 Java数组01:数组的定义 数组是相同类型数据的有序集合. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成. 其中,每一个数 ...
- .NET 响应式编程 System.Reactive 系列文章(二):深入理解 IObservable<T> 和 IObserver<T>
.NET 响应式编程 System.Reactive 系列文章(二):深入理解 IObservable<T> 和 IObserver<T> 引言:为什么我们调整了学习顺序? 在 ...