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]表示当前 ...
随机推荐
- Graylog之安装
Graylog是一个开源的日志聚合.分析.审计.展现和预警工具.功能上和ELK类似,但又比ELK要简单,依靠着更加简洁,高效,部署使用简单的优势很快受到许多人的青睐 安装部署: 单机部署,最小化部署 ...
- WinUI(WASDK)使用BotSharp框架开发多智能体桌面机器人管理助手(生图开关灯不在话下)
前言 大语言模型(Large Language Models, LLMs)近年来在各行各业中展现出了巨大的潜力和影响力.从自然语言处理到自动化客服,从内容生成到智能助手,LLMs正在改变我们与技术互动 ...
- 命令行应用开发初学者指南:脚手架篇、UI 库和交互工具
在日常的前端开发工作中,我们经常依赖各种命令行工具来提高效率和代码质量.例如,create-react-app 和 eslint 等工具不仅简化了项目的初始化过程,还能自动执行代码检查和格式化任务.当 ...
- 销讯通CRM系统如何确保拜访数据的真实有效
销讯通CRM系统如何确保并检查拜访过程数据的真实性,是一个值得深入探讨的课题. 01 在信息化高度发达的今天,我们拥有GPS定位.AI人脸识别等先进技术,这些技术无疑为数据的真实有效性提供了强有力的保 ...
- C语言离散化
C语言离散化 最近看到STL就不想用, 于是写个C语言离散化, 居然能过主席树板子, 就写个博客介绍一下. qsort和bsearch都在<stdlib.h>或<cstdlib> ...
- kubeadm 部署k8s
kubeadm 部署k8s 闲聊 考虑了很久,打算写一篇保姆级部署从0-1构建企业级cicd流水线,把工作上面所用到的技术点分享给大家.从最k8s,harbor,jenkins,gitlab,dock ...
- 攻防世界:Web习题之 get_post
攻防世界:Web习题之 get_post 题目内容 https://adworld.xctf.org.cn/challenges/list 题目首先需要我们用GET方式提交一个名为a,值为1的变量: ...
- 不求甚解--详解ansible-playbook中roles的用法(二)
前言 本文将详细介绍ansible-playbook中roles的各种用法 环境准备 组件 版本 操作系统 Ubuntu 22.04.4 LTS ansible 2.17.6 基本用法 文件结构 . ...
- 07C++选择结构(1)
一.基础知识 1.关系运算符 因为我们要对条件进行判断,必然会用到关系运算符: 名称 大于 大于等于 小于 小于等于 等于 不等于 符号 > >= < <= == != 关系表 ...
- Spring完全注解开发
注解的好处:如果管理很多的Bean,要求这些Bean都配置在applocationContext.xml文件中.用了注解之后,就不需要在xml文件中配置了,Spring提供了几个辅助类会自动扫描和装配 ...