boost笔记:boost::Graph中找出所有环

1. 问题描述

本文描述了找出一个有向连通图中所有的环的解决方案

测试用到的有向连通图
在这里插入图片描述

2. 自写算法

通过深度优先遍历算法,发现回边时,即存在环的原理来找出环。对于用共享边的环,以下算法有些环找不出来,如上图中的2->8->9->6->2。为什么找不出来,自己走一边深度优先遍历的过程再结合算法原理即可得知。使用的函数为boost::depth_first_search, 具体参看后文算法实现

3. boost自身实现的tiernan算法找环

使用的函数为boost::tiernan_all_cycles, 具体参看后文算法实现。
注:常规写完后,有编译错误,说找不到标识符renumber_vertex_indices,是个bug, 可参看https://github.com/boostorg/graph/issues/182

4. 完整测试代码与结果

#include <boost/config.hpp>
#include <iostream>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/depth_first_search.hpp>
#include <boost/graph/tiernan_all_cycles.hpp> #include <vector>
#include <map>
#include <stack>using namespace std;
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS> MyGraph;//只实现了有向图的找环,对于用共享边的环,以下算法有些环找不出来
//boost::add_edge(0, 1, g);
//boost::add_edge(1, 2, g);
//boost::add_edge(2, 3, g);
//boost::add_edge(3, 4, g);
//boost::add_edge(4, 5, g);
//boost::add_edge(4, 2, g);
//boost::add_edge(6, 2, g);
//boost::add_edge(7, 6, g);
//boost::add_edge(4, 7, g);
//boost::add_edge(2, 8, g);
//boost::add_edge(8, 9, g);
//boost::add_edge(9, 6, g);
struct FindCycleVisitor : public boost::default_dfs_visitor
{std::stack<MyGraph::vertex_descriptor> m_stack;std::vector<MyGraph::vertex_descriptor> m_cycle;FindCycleVisitor(){}template <class Vertex, class Graph>void discover_vertex(Vertex u, const Graph& g){m_stack.push(u);}template <class Edge, class Graph>void back_edge(Edge e, const Graph& g) {auto u = boost::source(e, g);auto v = boost::target(e, g);// Find the top of the stack that is an ancestor of v  std::stack<MyGraph::vertex_descriptor> temp_stack = m_stack;while (!temp_stack.empty() && temp_stack.top() != v) {m_cycle.push_back(temp_stack.top());temp_stack.pop();}m_cycle.push_back(v); // Include v in the cycle  // Optionally, print or store the cycle  std::cout << "Cycle found: ";for (auto it = m_cycle.crbegin(); it != m_cycle.crend(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// Clear the cycle for the next detection (optional)  m_cycle.clear();}template <class Vertex, class Graph>void finish_vertex(Vertex v, const Graph& g) {m_stack.pop();}
};// 自定义访问者,用于打印找到的环 
// see https://github.com/boostorg/graph/issues/182
namespace boost
{template<typename Graph>void renumber_vertex_indices(Graph const&) {}
}
struct TiernanCycleVisitor {TiernanCycleVisitor(){}template <typename Graph>void cycle(const std::vector<typename Graph::vertex_descriptor>& path, Graph g) const{for (Graph::vertex_descriptor v : path){std::cout << v << " ";}std::cout << std::endl;}
};int main(int argc, char** argv)
{MyGraph g;boost::add_edge(0, 1, g);boost::add_edge(1, 2, g);boost::add_edge(2, 3, g);boost::add_edge(3, 4, g);boost::add_edge(4, 5, g);boost::add_edge(4, 2, g);boost::add_edge(6, 2, g);boost::add_edge(7, 6, g);boost::add_edge(4, 7, g);boost::add_edge(2, 8, g);boost::add_edge(8, 9, g);boost::add_edge(9, 6, g);//自写算法查找环std::cout << "自写算法查找环:" << std::endl;FindCycleVisitor vis;boost::depth_first_search(g, boost::visitor(vis));// 使用tiernan_all_cycles算法查找所有环  std::cout << "tiernan算法查找环:" << std::endl;TiernanCycleVisitor tiernanVis;boost::tiernan_all_cycles(g, tiernanVis);return 0;}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58402.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DriftingBlues: 1渗透测试

靶机&#xff1a;DriftingBlues: 1 DriftingBlues: 1 ~ VulnHubhttps://www.vulnhub.com/entry/driftingblues-1,625/ 攻击机&#xff1a;kail linux 2024 1,将两台虚拟机网络连接都改为NAT模式&#xff0c;并查看靶机的MAC地址 2&#xff0c;攻击机上做主机扫描发现靶机 靶机I…

【C++单调栈 记忆化搜索】1130. 叶值的最小代价生成树|1919

本文涉及的基础知识点 C单调栈 C记忆化搜索 C动态规划 LeetCode1130. 叶值的最小代价生成树 给你一个正整数数组 arr&#xff0c;考虑所有满足以下条件的二叉树&#xff1a; 每个节点都有 0 个或是 2 个子节点。 数组 arr 中的值与树的中序遍历中每个叶节点的值一一对应。 每…

【我的 PWN 学习手札】setcontext + ROP

堆上的setcontext利用系列还有&#xff1a; 【我的 PWN 学习手札】setcontext shellcode-CSDN博客 目录 前言 一、setcontext gadget 二、setcontext ROP &#xff08;一&#xff09;setcontext设置寄存器 &#xff08;二&#xff09;ROP链布置 三、图示 四、模板与…

【算法】Kruskal最小生成树算法

目录 一、最小生成树 二、Kruskal算法求最小生成树 三、代码 一、最小生成树 什么是最小生成树&#xff1f; 对于一个n个节点的带权图&#xff0c;从中选出n-1条边&#xff08;保持每个节点的联通&#xff09;构成一棵树&#xff08;不能带环&#xff09;&#xff0c;使得…

信号完整性SI总结【小登培训】

信号完整性问题的根源通常在于阻抗不匹配、串扰、时序误差、电磁辐射和电源噪声。解决这些问题需要从PCB设计、布线、材料选择、匹配和屏蔽等多个方面综合考虑&#xff0c;并结合眼图分析等工具进行调试和优化。确保信号完整性对于高速电路设计尤为重要&#xff0c;影响系统的可…

【蓝桥杯选拔赛真题78】python电话号码 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析

目录 python电话号码 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python电话号码 第十五届蓝桥杯青少年组python比赛选拔赛真题 一、题目要…

2022NOIP练习总结

种花 1.本题是一道前缀和优化加上枚举的问题。先考虑 C 因为 F 是 C 下边随便加一个点&#xff0c;所以只要求出 C 就求出了 F 。 注意到&#xff0c;并没有要求上下行一样&#xff0c;唯一的要求是 C 的两个横要隔一行&#xff0c;这就是问题的突破点&#xff0c;这题很明显…

【Spring Boot】元注解

元注解 1.元注解1.1 Target1.2 Retention1.3 Inherited1.4 Documented1.5 interface 2.自定义注解2.1 创建自定义注解类2.2 实现业务逻辑2.3 使用自定义注解 1.元注解 元注解就是定义注解的注解&#xff0c;是 Java 提供的用于定义注解的基本注解。 注解 说明 Retention是注解…

高速定向广播声光预警系统赋能高速安全管控

近年来&#xff0c;高速重大交通事故屡见不鲜&#xff0c;安全管控一直是高速运营的重中之重。如何利用现代化技术和信息化手段&#xff0c;创新、智能、高效的压降交通事故的发生概率&#xff0c;优化交通安全管控质量&#xff0c;是近年来交管部门的主要工作&#xff0c;也是…

Cmake Error:could not find any instance of Visual Studio.

出现以下错误 解决方案&#xff1a; 安装visual stuido 2017。 检查是否安装“使用C的桌面开发” 检查是否安装了扩展开发 点开“单个组件”是否安装了以下组件 编辑计算机环境变量&#xff0c;

kotlin定时器和主线程定时器

场景 最近要用kotlin写一个每隔一段时间切视频并截图 刷刷的就写出来了&#xff0c;很快啊 timerTask object : TimerTask() {override fun run() {captureWindow()if ((group 1) * 4 > urls.size) {showDialog()timerTask.cancel()timer.cancel()}groupupdatePlayers(…

美国大学生数学建模竞赛(MCM/ICM)介绍

美国大学生数学建模竞赛(MCM/ICM)是一项具有较高影响力的国际赛事。以下是一份美赛教程: 一、前期准备 组队 寻找合适的队友,最好具备不同的专业技能,如数学、计算机、工程等。团队成员应具备良好的沟通能力、合作精神和责任心。明确各自的分工,例如有人负责建模、有人负…

如何在macOS开发中给 PKG 签名和公证(productsign+notarytool)

在macOS中&#xff0c;给PKG文件进行签名是一个确保用户能够顺利无警告地安装软件的重要步骤。以下是给PKG签名的详细步骤&#xff1a; 一、准备阶段 获取开发者账号和证书&#xff1a; 首先&#xff0c;需要在苹果开发者网站&#xff08;Apple Developer&#xff09;注册一个…

EtherNet转Profinet主站网关以太网总线协议转换模块一文即可搞懂

稳联技术(WL-ABC2006)EtherNet/IP转Profinet网关是一种工业网络设备&#xff0c;它能够实现两种不同工业以太网协议之间的数据交换和通信。这种网关在工业自动化领域中非常重要&#xff0c;因为它允许不同品牌和协议的设备之间进行互联互通&#xff0c;从而提高了系统的灵活性和…

springboot配置websocket

springbootboot配置websocket import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component;import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.util.Map; import java…

计算机网络:网络层 —— IPv4 协议的表示方法及其编址方法

文章目录 IPv4IPv4的表示方法IPv4的编址方法分类编址A类地址B类地址C类地址可指派的地址数量一般不使用的特殊IPv4地址 划分子网编址子网掩码默认子网掩码 无分类编址方法地址掩码斜线记法无分类域间路由选择 CIDR IPv4 IPv4&#xff08;Internet Protocol version 4&#xff…

rtp协议:rtcp包发送和接收规则和报告!

RTCP Packet Send and Receive Rules&#xff1a; 发送和接收 RTCP 包的规则在此列出。允许在多播环境或多点单播环境中运行的实现必须满足第 6.2 节中的要求。这样的实现可以使用本节定义的算法来满足这些要求&#xff0c;或者可以使用其他算法&#xff0c;只要其性能等同或更…

详细解读 CVPR2024:VideoBooth: Diffusion-based Video Generation with Image Prompts

Diffusion Models专栏文章汇总:入门与实战 前言:今天是程序员节,先祝大家节日快乐!文本驱动的视频生成正在迅速取得进展。然而,仅仅使用文本提示并不足以准确反映用户意图,特别是对于定制内容的创建。个性化图片领域已经非常成功了,但是在视频个性化领域才刚刚起步,这篇…

在Excel中如何快速筛选非特定颜色

Excel中的自动筛选是个非常强大的工具&#xff0c;不仅可以筛选内容&#xff0c;而且可以筛选颜色&#xff0c;例如筛选A列红色单元格。但是有时希望筛选除了红色之外的单元格&#xff08;下图右侧所示&#xff09;&#xff0c;其他单元格的填充色不固定&#xff0c;有几种颜色…

【Java】java | logback日志配置 | 按包配置级别

一、概述 日志配置需求&#xff1a; 本地部分包开debug&#xff0c;其他路径走配置&#xff1b;只在本地环境有效 二、logback.xml配置 <!--本地调试&#xff0c;开debug--> <springProfile name"dev"><logger name"cn.hg.demo" level&quo…