Boost Graph Library中VF2(子图同构)算法的使用

Boost Graph Library,简称BGL,库中有各种各样经典的Graph算法,这里介绍其中的VF2算法——vf2_subgraph_iso。

数据怎么存

  • 在BGL中,图是用adjacency_list类型数据存储,也就是邻接列表,里面可以存顶点信息,连接边信息,以下面的代码为例,介绍下这个接口的使用方法,具体详情如下代码所示:
#include<string>
#include<iostream>
#include<vector>
#include<stack>
#include<boost/property_map/property_map.hpp>
#include<boost/graph/adjacency_list.hpp>
#include <boost/graph/named_function_params.hpp>
#include <boost/graph/graphviz.hpp>
#include <boost/graph/properties.hpp>
#include <boost/graph/vf2_sub_graph_iso.hpp>
using namespace std;
using namespace boost;//自定义顶点信息结构体
struct V {string m_name;int m_id;bool operator==(const V& other) // 这里需要重写这个运算符,当使用自定义类型作为顶点类型时,算法判断顶点是否相等,最终会走到顶点的==运算符中。{return m_id == other.m_id;}};struct E {string m_name;double m_wight;bool operator==(const E& other)// 同顶点信息的运算符{return m_wight == other.m_wight;}
};template < typename Graph1, typename Graph2 >
struct MyVF2Callback // 自定义回调函数,当算法运算完毕需要输出结果时,是采用回调的方式输出结果,所以会在重载的运算符()输出结果,
{MyVF2Callback(const Graph1& graph1, const Graph2& graph2): graph1_(graph1), graph2_(graph2){}template < typename CorrespondenceMap1To2, typename CorrespondenceMap2To1 >bool operator()(CorrespondenceMap1To2 f, CorrespondenceMap2To1) const{// Print (sub)graph isomorphism mapBGL_FORALL_VERTICES_T(v, graph1_, Graph1)std::cout << '(' << get(vertex_index_t(), graph1_, v) << ", "<< get(vertex_index_t(), graph2_, get(f, v)) << ") ";return true;}private:const Graph1& graph1_;const Graph2& graph2_;
};// 自定义比较函数,根据顶点属性中的m_id进行排序,这里只是随便例举了一个属性,当然可以使用任意的属性作比较
template<typename PropertyMap>
struct CompareById {const PropertyMap& property_map;CompareById(const PropertyMap& map): property_map(map) {}// 是以自定义顶点结构体的m_id作为判断依据bool operator()(const typename boost::property_traits<PropertyMap>::key_type& u,const typename boost::property_traits<PropertyMap>::key_type& v) const {return property_map[u].m_id < property_map[v].m_id;}
};// 自定义顶点排序搜索函数
template<typename Graph>
std::vector<typename boost::graph_traits<Graph>::vertex_descriptor>
vertex_order_by_id(const Graph& graph) {auto property_map = get(vertex_name, graph);typedef decltype(property_map) PropertyMap;typedef typename boost::graph_traits<Graph>::vertex_descriptor Vertex;std::vector<Vertex> vertex_order;std::copy(boost::vertices(graph).first, boost::vertices(graph).second,std::back_inserter(vertex_order));std::sort(vertex_order.begin(), vertex_order.end(), CompareById<PropertyMap>(property_map));return vertex_order;
}void main()
{typedef property< edge_name_t, E > edge_property; //定义边的属性,其中E是自定义类型,在途中使用get(edge_name, Graph)返回的就是E类型的property_map。typedef property< vertex_name_t, V, property< vertex_index_t, int > > //定义顶点的属性,property< vertex_index_t, int >表示顶点容器的索引值为int类型vertex_property;// Using a vecS graphs => the index maps are implicit.typedef adjacency_list< vecS, vecS, bidirectionalS, vertex_property,edge_property >graph_type;// Build graph1graph_type graph1;add_vertex(V({ "1", 1 }), graph1); // 加入第一个顶点信息,顶点属性数据是V({ "1", 1 })add_vertex(V({ "2", 2 }), graph1);// 加入第二个顶点信息,顶点属性数据是V({ "2", 2 })add_vertex(V({ "3", 3 }), graph1);add_edge(0, 1, E({ "e0", 11 }), graph1);// 加入边信息,边的两个顶点idx是0和1,边的属性数据是E({ "e0", 11 })// Build graph2graph_type graph2;add_vertex(V({ "11", 1 }), graph2); // 同graph1add_vertex(V({ "22", 2 }), graph2);add_vertex(V({ "33", 3 }), graph2);add_edge(2, 2, E({"e1", 10}), graph2);// create predicatestypedef property_map< graph_type, vertex_name_t >::type vertex_name_map_t;typedef property_map_equivalent< vertex_name_map_t, vertex_name_map_t >vertex_comp_t;vertex_comp_t vertex_comp = make_property_map_equivalent(get(vertex_name, graph1), get(vertex_name, graph2)); // 定义顶点的比较器,最终会走到顶点类型中operator()里typedef property_map< graph_type, edge_name_t >::type edge_name_map_t;typedef property_map_equivalent< edge_name_map_t, edge_name_map_t >edge_comp_t;edge_comp_t edge_comp = make_property_map_equivalent(get(edge_name, graph1), get(edge_name, graph2));// 定义边的比较器,最终会走到边类型中operator()里// Create callbackMyVF2Callback< graph_type, graph_type > callback(graph1, graph2); /*定义回调函数,算法匹配结果会在这里输出,如果使用BGL默认的 “vf2_print_callback<graph_type, graph_type> callback(graph1,                                        graph2);”是没办法以自己的方式去处理输出数据,默认的只是将输出输出在控制平台*//**这里是算法的入口,主要是callback 和vertex_order_by_id(graph1)参数我们可以修改,callback是回调函数,算法结果输出的位置;* vertex_order_by_id这个是小图搜索顶点的数组,也就是这里容器的顺序就是算法搜索顶点的顺序,默认的是 vertex_order_by_mult(graph1),* 是以顶点的入读和出度的乘积作为排序的参数,如果希望自定义排序,就需要按照要求定义一个排序,参照上述代码中的vertex_order_by_id,也就是输出的类型需要时是 std::vector< typename graph_traits< Graph >::vertex_descriptor >,就是小图 vertex_descriptor(可以理解为索引)的数组。*/vf2_subgraph_iso(graph1, graph2, callback, vertex_order_by_id(graph1), edges_equivalent(edge_comp).vertices_equivalent(vertex_comp));}

详细的接口与参数的含义都在代码中注释了,如果还有不理解的问题,请留言一起讨论~

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

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

相关文章

【C语言】数据结构和流程控制语句

C语言是一种广泛应用于系统编程和应用软件开发的高级编程语言。它提供了丰富的数据结构和流程控制语句&#xff0c;使程序员能够更有效地组织数据和控制程序的执行流程。本文将介绍C语言中常用的数据结构和流程控制语句&#xff0c;以帮助读者更好地理解和使用C语言。 1. 数据…

vue使用element-ui 实现自定义分页

可以通过插槽实现自定义的分页。在layout里面进行配置。 全部代码 export default { name:Cuspage, props:{total:Number, }, data(){return {currentPage:1,pageSize:10,} } methods: {setslot (h) {return(<div class"cusPage"›<span on-click{this.toBe…

E4-R升级固件方法 RockChip 3562

芯片&#xff1a;RockChip 3562 开发板 先安装驱动&#xff1a;DriverAssitant_v5.1.1 下载工具&#xff1a;RKDevTool_v3.13_for_window 烧录完整的update.img固件 1.选择update.img 2.关机下&#xff0c;同时Update和Power进入maskrom模式。界面会显示设备 3.点击升级 …

vue部署在nginx上的配置

1. vue中配置跨域后, 后端服务代理配置. 这里表示将所有的 /dev-api/ 开头的请求都转发到下面 proxy_pass 指定的链接中. 为了防止在访问页面时请求就被 Nginx 代理转发&#xff0c;这里需要更具体的配置&#xff0c;才能和前端访问请求区分开 2. Vue 路由刷新时可能会抛出 4…

【代码随想录算法训练营第二十七天 | LeetCode39. 组合总和、 40.组合总和II、131.分割回文串】

代码随想录算法训练营第二十七天 | LeetCode39. 组合总和、 40.组合总和II、131.分割回文串 一、39. 组合总和 解题代码C&#xff1a; class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& c…

avue-crud顶部操作按钮插槽;avue-crud列数据插槽;avue-crud行操作按钮插槽

1.avue-crud顶部操作按钮插槽&#xff1b; <template slot"menuLeft" slot-scope"{ size }"><div class"left"><div class"btn"><el-button type"primary" size"small" click"onBatchR…

新能源汽车小三电系统

小三电系统 新能源电动汽车的"小三电"系统&#xff0c;一般指车载充电机(OBC)、车载 DC/DC 变换器&#xff0c;和高压直流配电盒(PDU)。一辆纯电动汽车一般配备一台OBC 和一台车载 DC/DC 变换器。OBC将外部输入的交流电转化为直流电输出给电池&#xff0c;DC/DC衔接…

zabbix配置

1 下载zabbix 1 配置yum源 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release- 5.0-1.el7.noarch.rpm yum clean all yum makecache fast 完成后会出现zabbix.repo文件 2安装zabbix服务 yum -y install zabbix-server-mysql zabbix-web-mysql z…

使用stream流合并多个List(根据实体类特定属性合并)

开发情景 现有多个List集合,其中都是一样的实体类,这里我想根据实体类的特定属性将它们合并在一起,形成一个最终的List集合。 这里主要用到了Stream流的flatMap方法与reduce方法。 flatMap:可以将多个Stream流合并在一起,形成一个Stream流。 reduce:可以将Stram流中的元…

初级爬虫实战——哥伦比亚大学新闻

文章目录 发现宝藏一、 目标二、简单分析网页1. 寻找所有新闻2. 分析模块、版面和文章 三、爬取新闻1. 爬取模块2. 爬取版面3. 爬取文章 四、完整代码五、效果展示 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不…

力扣经典题:删除字符使字符串变好

char* makeFancyString(char* s) {int sizestrlen(s);char*arr(char*)malloc(sizeof(char)*size1);if(size<3){return s;}arr[0]s[0];arr[1]s[1];int p2;for(int j2;j<size;j){if(s[j]!s[j-1]||s[j]!s[j-2]){arr[p]s[j];p;}}arr[p]\0;return arr; } 此代码的细节很多&am…

mac笔记本执行定时任务

1.mac本地设置一个定时任务每小时执行一次&#xff0c;在/Users/xxx/go/src/runing目录下执行命令&#xff1a;./git_push.sh 在macOS中&#xff0c;你可以使用crontab来设置定时任务。打开终端并执行以下步骤&#xff1a; 1.打开当前用户的crontab编辑器&#xff1a; crontab …

大模型训练准备工作

一、目录 1 大模型训练需要多少算力&#xff1f; 2. 大模型训练需要多少显存&#xff1f; 3. 大模型需要多少数据量训练&#xff1f; 4. 训练时间估计 5. epoch 选择经验 6. 浮点计算性能测试 二、实现 1 大模型训练需要多少算力&#xff1f; 训练总算力&#xff08;Flops&…

python知识点总结(三)

python知识点总结三 1、有一个文件file.txt大小约为10G&#xff0c;但是内存只有4G&#xff0c;如果在只修改get_lines 函数而其他代码保持不变的情况下&#xff0c;应该如何实现? 需要考虑的问题都有那些?2、交换2个变量的值3、回调函数4、Python-遍历列表时删除元素的正确做…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TextPicker)

滑动选择文本内容的组件。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 TextPicker(options?: {range: string[] | string[][] | Resource | TextPickerRangeContent[] | Te…

Redis-Sentinel哨兵

Redis Sentinel可以通过心跳检测的方式监视多个主服务器以及它们属下的所有从服务器&#xff0c;并在某个主服务器下线时自动对其实施故障转移。 1 启动Sentinel 一个Sentinel配置文件至少需要包含以下选项&#xff0c;用于指定Sentinel要监视的主服务器&#xff1a; sentine…

PyTorch深度学习框架:综合入门与应用指南

引言&#xff1a;掌握PyTorch版本信息的必要性 在深度学习的广阔天地中&#xff0c;PyTorch以其卓越的灵活性和易用性&#xff0c;成为了研究人员和开发者的首选框架。了解正在使用的PyTorch版本对于保证代码的兼容性和项目的顺利进行至关重要。尤其是在多人合作和多环境切换的…

MC0206 小码哥的英语

小码哥在做英语单选题的时候突然想到了一个很有意思的问题&#xff1a;单选题的答案都是A或者B&#xff0c;那么很多道题目的答案组成的就是一个A和B组成的字符串。如果两个相邻的题目的答案是相同的&#xff0c;小码哥就可以修改这两个题目的答案&#xff0c;改成都是A、都是B…

前端流式(stream)请求,获取持续响应的方式

在网络请求中,流(stream)表示持续接收数据的过程。使用流,可以逐步获取服务器响应,而不是等待整个响应完成后一次性获取。 Axios 通过监听响应对象的 data 事件,可以实现流式请求,主要的写法有直接 pipe 流和手动监听事件两种。使用流可以实现大文件或数据的流传输,有效…

深度解读:如何解决Image-to-Video模型视频生成模糊的问题?

Diffusion Models视频生成-博客汇总 前言&#xff1a;目前Image-to-Video的视频生成模型&#xff0c;图片一般会经过VAE Encoder和Image precessor&#xff0c;导致图片中的信息会受到较大损失&#xff0c;生成的视频在细节信息上与输入的图片有较大的出入。这篇博客结合最新的…