题目链接

题目

题目描述

给定一张n个点m条边的无向图,求出图中所有简单环的数量。(简单环:简单环又称简单回路,图的顶点序列中,除了第一个顶点和最后一个顶点相同外,其余顶点不重复出现的回路叫简单回路。或者说,若通路或回路不重复地包含相同的边,则它是简单的)

输入描述

第一行三个数n m k (k在输出描述中提到)

接下来m行每行两个数u,v表示u到v之间存在一条边(无重边)

输出描述

输出k行每行1个整数

第i个数表示长度%k==i-1的简单环的数量(对998244353取模)

(只记录长度大于2的简单环的数量)

示例1

输入

4 6 3
1 2
2 3
3 4
4 1
2 4
1 3

输出

4
3
0

备注

n<=20

m<=n*(n-1)/2

k<=n

题解

知识点:状压dp。

比普通的TSP多了个环计数,应当在遍历每个状态时,查看起点和终点是否能够连接,能的话就给这个长度计数。为了避免重复计算,每次第一个 \(1\) 作为起点,选择终点应当在起点之后,防止出现不同的终点和起点对应同一个环的重复。最后应该除以二,消除顺时针逆时针的重复。

时间复杂度 \(O(m+n^22^n+q)\)

空间复杂度 \(O(n2^n+nm+q)\)

代码

#include <bits/stdc++.h>

using namespace std;

const int mod = 998244353;
int g[27][27];
int dp[(1 << 20) + 7][27];///状态i且最后一个点为j时,除去连成环会重复的可能的所有方案
int ans[27]; int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m, q;
cin >> n >> m >> q;
for (int i = 1;i <= m;i++) {
int u, v;
cin >> u >> v;
g[u][v] = 1;
g[v][u] = 1;
}
for (int i = 1;i <= n;i++) dp[1 << i - 1][i] = 1;
for (int i = 1;i < (1 << n);i++) { int s = 0;///规定每个状态的第一个1为起点
for (int j = 1;j <= n;j++) {
if (i & (1 << j - 1)) {
s = j;
break;
}
}
int len = __builtin_popcount(i); for (int j = s + 1;j <= n;j++) {///枚举状态i的最后一个点
///最后一个点要在起点后面,因为最终会连成环,防止环形性重复计数,如..j...s.. <-> ..s...j..的等价情况 if (!(i & (1 << j - 1))) continue;
for (int k = s;k <= n;k++) {///枚举上一次的最后一个点,只会在起点及其后面
if (!(i & (1 << k - 1))) continue;
if (g[j][k]) dp[i][j] = (dp[i][j] + dp[i ^ (1 << j - 1)][k]) % mod;///如果有通路,则可以连上
}///计算合法链的方案 if (g[s][j] && len >= 3)///起点和终点能连上且长度大于等于3时,属于能连成合法的环
ans[len % q] = (ans[len % q] + dp[i][j]) % mod;
}
}
for (int i = 0;i < q;i++)
cout << 1LL * ans[i] * 499122177 % mod << '\n';///顺时针逆时针的重复计数消除
return 0;
}

NC16544 简单环的更多相关文章

  1. Codeforces Round #161 (Div. 2) D. Cycle in Graph(无向图中找指定长度的简单环)

    题目链接:http://codeforces.com/problemset/problem/263/D 思路:一遍dfs即可,dp[u]表示当前遍历到节点u的长度,对于节点u的邻接点v,如果v没有被访 ...

  2. poj 3895(求无向图的最大简单环)

    题目链接:http://poj.org/problem?id=3895 思想很简单,就是dfs,并且用一个数组记录到该节点所走过的长度,然后如果遇到已经走过的,就说明存在环了, 更新一下ans. /* ...

  3. Cyclic Components CodeForces - 977E(找简单环)

    题意: 就是找出所有环的个数, 但这个环中的每个点都必须只在一个环中 解析: 在找环的过程中 判断度数是否为2就行...emm... #include <bits/stdc++.h> us ...

  4. bzoj3037--贪心

    题目大意: applepi手里有一本书<创世纪>,里面记录了这样一个故事--上帝手中有着N 种被称作"世界元素"的东西,现在他要把它们中的一部分投放到一个新的空间中去以 ...

  5. Codeforces Round #383(div 2)

    A.快速幂 B. 题意:求ai^aj=x的数对个数,x和a[]给定 分析:a^b=c,则a^c=b,所以求ai^x=aj的个数,枚举一遍即可 C. 题意:给你一个有向图,每个点的出边只有一条,求最小的 ...

  6. HDU3394:Railway

    传送门 点双练习. 对于一张图,询问有多少条边不属于任意一个点双和多少条边至少属于两个点双. 显然,一张图里有多少个桥就是第一问的答案. 对于第二问,考虑对于一个点双,如果其中的边数等于点数,那么这个 ...

  7. 【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集

    4316: 小C的独立集 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 57  Solved: 41[Submit][Status][Discuss] ...

  8. NOIp Graph 1002 瞎眼记

    又是虚脱的一天啊QAQ,早上习惯性迟到,九点多到学校开始码题,六道题看下来花了将近一个小时,主要纠结于第二题和第六题.到了十点,没再深入思考,开始码题.. 一直到十一点半,写了两道题.然后吃完饭后中午 ...

  9. thusc滚粗记

    day0 下午到了北京,雾霾还是那么大.. 到宾馆报个到,和哥哥吃了一波饭,去不起西郊...只能去五道口了... 晚上和wyz队长见面,wyz队长好帅啊...没带手机拍照真是个错误TAT day1 今 ...

  10. 模拟赛1031d2

    巧克力棒(chocolate)Time Limit:1000ms Memory Limit:64MB题目描述LYK 找到了一根巧克力棒,但是这根巧克力棒太长了, LYK 无法一口吞进去.具体地,这根巧 ...

随机推荐

  1. Zookeeper 的 ZAB 协议 以及 zookeeper 与 nacos 注册中心比对

    本文为博主原创,未经允许不得转载: 目录: 1. ZAB 协议 2. zookeer 节点状态 3. zookeeper 注册中心与 nacos 注册中心比较 4. zookeeper 配置注册中心 ...

  2. kafka 集群环境搭建

    本文为博主原创,未经允许不得转载: 如果搭建单机节点 kafka 可看我的这篇博客: 搭建 kafka 集群环境,只需要在搭建单机 kafka 环境的基础上,多增加几个kafka 服务实例即可. 多增 ...

  3. Angular系列教程之变更检测与性能优化

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  4. 文件传输中的MD5校验技术

    1. 文件的MD5校验简介 文件的MD5校验是一种常用的文件完整性验证方法.MD5(Message Digest Algorithm 5)是一种广泛应用的哈希算法,它能够将任意长度的数据转换为固定长度 ...

  5. 通过 DBCA 创建 Oracle Database 21c 的进度停滞在 36%

    1.问题 安装过程中一直卡在36% 检查 dbca 日志文件 位于 H:\app\trmbh\cfgtoollogs\dbca\ORCL\trace.log_2023-09-12_12-04-20PM ...

  6. 【BUS】LIN Bus

    概述 随着汽车内电子设备的增多,市场上对于成本低于 CAN 的总线的需求日益强烈,不同的车厂相继开发各自的串行通信(UART/SCI)协议,以在低速和对性能要求不高的场合取代CAN.由于不同车厂定义的 ...

  7. JS - 兼容到 IE 8

    使用 jQuery可以有效的兼容IE 浏览器 , 但jQuery从2.0开始不兼容IE8,最低支持IE9,所以需要引入更低的jQuery版本来兼容 <script type="text ...

  8. [转帖]关于面试时HA(RAC)会问到的一些问题

    1.什么是RAC(Real Application Cluster)? RAC(Real Application Cluster)是Oracle数据库的一种部署架构,它将多个数据库服务器连接在一起,共 ...

  9. [转帖]【MySQL 8】MySQL 5.7都即将停只维护了,是时候学习一波MySQL 8了!

    https://juejin.cn/post/7111255789876019208 MySQL 8新特性 选择MySQL 8的背景:MySQL 5.6已经停止版本更新了,对于 MySQL 5.7 版 ...

  10. [转帖]ssd/san/sas/磁盘/光纤/RAID性能比较

    https://plantegg.github.io/2022/01/25/ssd_san%E5%92%8Csas%E7%A3%81%E7%9B%98%E6%80%A7%E8%83%BD%E6%AF% ...