- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用 Boost 的 vf2_subgraph_iso()
检测子图同构。
我可以在简单的图表上成功做到这一点,但不能在 multigraph 上做到这一点(允许有多个边的图)。
考虑检测以下 G1 和 G2 之间的子图同构:
G1 是 G2 的子图,我想使用以下代码检测它:
#include <vector>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/vf2_sub_graph_iso.hpp>
int main()
{
// Define edge property
typedef boost::property<
boost::edge_name_t,
char
> edge_property;
// Define graph type
typedef boost::adjacency_list<
boost::vecS, // OutEdgeListS
boost::vecS, // VertexListS
boost::bidirectionalS, // DirectedS
boost::no_property, // VertexProperties
edge_property, // EdgeProperties
boost::no_property, // GraphProperties
boost::listS // EdgeListS
> MyGraphType;
// Build graph G1
MyGraphType g1;
std::vector<MyGraphType::vertex_descriptor> v1(3);
for (auto itr = v1.begin(); itr != v1.end(); ++itr) {
*itr = boost::add_vertex(g1);
}
boost::add_edge(v1[0], v1[1], edge_property('a'), g1);
boost::add_edge(v1[0], v1[2], edge_property('a'), g1);
boost::add_edge(v1[1], v1[2], edge_property('b'), g1);
// Build graph G2
MyGraphType g2;
std::vector<MyGraphType::vertex_descriptor> v2(3);
for (auto itr = v2.begin(); itr != v2.end(); ++itr) {
*itr = boost::add_vertex(g2);
}
boost::add_edge(v2[0], v2[1], edge_property('a'), g2);
boost::add_edge(v2[0], v2[2], edge_property('a'), g2);
boost::add_edge(v2[1], v2[2], edge_property('a'), g2);
boost::add_edge(v2[1], v2[2], edge_property('b'), g2);
// Create predicate of edge
typedef boost::property_map<MyGraphType, boost::edge_name_t>::type edge_name_map_t;
typedef boost::property_map_equivalent<edge_name_map_t, edge_name_map_t> edge_comp_t;
edge_comp_t edge_comp = boost::make_property_map_equivalent(
boost::get(boost::edge_name, g1), boost::get(boost::edge_name, g2));
// Create callback
boost::vf2_print_callback<MyGraphType, MyGraphType> callback(g1, g2);
// Execute
const bool result = boost::vf2_subgraph_iso(
g1, g2, callback, boost::vertex_order_by_mult(g1),
boost::edges_equivalent(edge_comp));
std::cout << "subgraph isomorphic? " << std::boolalpha << result << std::endl;
return 0;
}
预期结果:
(0, 0) (1, 1) (2, 2)
subgraph isomorphic? true
实际结果:
subgraph isomorphic? false
我的代码哪里错了?
抱歉我的英语不好。谢谢!
最佳答案
vf2_subgraph_iso 会比较边的属性。在您的代码中,边 1->2 的属性在 graph1 中为 'b',但在 graph2 中为 'a','b'。所以它们不是相同的结构。
如果您希望它在仅匹配所有属性的一部分时返回 true,您可以根据您的规则使用结构和重载运算符“==”。对于您的示例,以下代码就可以了。
#include <vector>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/vf2_sub_graph_iso.hpp>
int main()
{
// Define edge property
struct EdgeProperties {
EdgeProperties() {}
EdgeProperties(char elabel) { _elabels.emplace_back(elabel);}
EdgeProperties(std::vector<char>& elabels) :_elabels(elabels) {}
/* overload == */
bool operator==(EdgeProperties const& other) const {
for (auto& my_l:_elabels) {
for (auto& o_l:other._elabels) {
if (my_l == o_l) return true;
}
}
return false;
}
std::vector<char> _elabels;
};
typedef boost::property<
boost::edge_name_t,
EdgeProperties
> edge_property;
// Define graph type
typedef boost::adjacency_list<
boost::vecS, // OutEdgeListS
boost::vecS, // VertexListS
boost::bidirectionalS, // DirectedS
boost::no_property, // VertexProperties
edge_property, // EdgeProperties
boost::no_property, // GraphProperties
boost::listS // EdgeListS
> MyGraphType;
// Build graph G1
MyGraphType g1;
std::vector<MyGraphType::vertex_descriptor> v1(3);
for (auto itr = v1.begin(); itr != v1.end(); ++itr) {
*itr = boost::add_vertex(g1);
}
boost::add_edge(v1[0], v1[1], edge_property('a'), g1);
boost::add_edge(v1[0], v1[2], edge_property('a'), g1);
boost::add_edge(v1[1], v1[2], edge_property('b'), g1);
// Build graph G2
MyGraphType g2;
std::vector<MyGraphType::vertex_descriptor> v2(3);
for (auto itr = v2.begin(); itr != v2.end(); ++itr) {
*itr = boost::add_vertex(g2);
}
boost::add_edge(v2[0], v2[1], edge_property('a'), g2);
boost::add_edge(v2[0], v2[2], edge_property('a'), g2);
std::vector<char> tmp;
tmp.emplace_back('a');
tmp.emplace_back('b');
boost::add_edge(v2[1], v2[2], edge_property(tmp), g2);
// Create predicate of edge
typedef boost::property_map<MyGraphType, boost::edge_name_t>::type edge_name_map_t;
typedef boost::property_map_equivalent<edge_name_map_t, edge_name_map_t> edge_comp_t;
edge_comp_t edge_comp = boost::make_property_map_equivalent(
boost::get(boost::edge_name, g1), boost::get(boost::edge_name, g2));
// Create callback
boost::vf2_print_callback<MyGraphType, MyGraphType> callback(g1, g2);
// Execute
const bool result = boost::vf2_subgraph_iso(
g1, g2, callback, boost::vertex_order_by_mult(g1),
boost::edges_equivalent(edge_comp));
std::cout << "subgraph isomorphic? " << std::boolalpha << result << std::endl;
return 0;
}
关于c++ - 如何使用 Boost 的 vf2_subgraph_iso 检测 multimap 上的子图同构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52550846/
据我所知,Aurelia 不支持提到的服务端渲染 here . 但问题是:是否可以通过一些技巧/解决方法来做到这一点? 最明显的想法是使用 Phantom、Nightmare.js 或其他任何工具在服
我目前正在开发一个在客户端和服务器之间使用一些共享 JS 的项目。技术堆栈包括 Node v6、Webpack、React 等。 有一个“共享”目录,服务器和客户端需要一个名为rules.js的文件。
我正在运行一个使用 React 和 webpack 的同构应用程序,一切都很好。不过,我正在努力处理的一件事是在渲染组件之前预加载 css。 我一直在尝试使用 导入我的 sass 文件(以便 webp
我找到了 2 个工具来解决服务器端模块加载器的问题:webpack-isomorphic-tools和 universal-webpack .有人可以向我解释这些东西如何工作的关键步骤吗?它如何捕获/
我基于 this repo 中的初学者工具包构建了一个同构 React 应用程序.它使用 webpack 构建生产代码。 问题是,我需要将服务器上的一些环境变量的值暴露给浏览器中的客户端代码,而无需重
我有一些同构的 JavaScript。我在客户端使用 RequireJS。 (function() { 'use strict'; function wrapper(require)
在 recursion-schemes 包定义了以下类型: newtype Fix f = Fix (f (Fix f)) newtype Mu f = Mu (forall a. (f a -> a
我正在努力了解服务器端路由和重定向与服务器端呈现/同构 javascript 之间的区别。如果它们不同,它们有何不同。 最佳答案 Universal (Isomorphic)Javascript 可以
我对 JavaScript 知识相当了解。我们计划使用 React、Redux、es6 等启动同构 Web 应用程序。我们有很多 API 调用需要集成。在开始之前,我想知道是否有可用的样板,或者最好一
我将应用程序重建为同构方法。在我的本地环境中一切正常(本地和在线 Node 版本相同)但不幸的是,将文件上传到我的网络服务器后,我收到以下错误消息: SyntaxError: .../index.js
我正在尝试创建一个 universal javascript (正式名称为同构 javascript)包。这意味着它应该作为 Node 模块工作,但也可以在浏览器中顺利运行 假设它看起来像这样: //
所以我几乎完成了我的第一个(同构)ReactJS,当我们部署它时,完成 build.js 有点慢。一个建议是使用 CDN 来分离 Assets 获取(cdn0、cdn1、cdn2...),我想知道如何
所以,我最近一直在摆弄一些同构的 React + Flux,说实话,发现一些概念相当令人困惑。我一直在研究有关如何构建同构应用程序的最佳实践并寻求建议。 假设您正在创建一个由同一 REST API 支
我正在 Next.js remote fetching 上做以下练习。我无法理解和适应的是练习从 http://api.tvmaze.com 获取数据。 . 数据如下: [ {"score":24,
我似乎遇到了一个奇怪的错误。我目前正在使用 Redux 同构,并且还包括 redux-thunk 作为异步操作的中间件。这是我的商店配置: // Transforms state date from
我在 CNTK 中调用 trainer.restore_from_checkpoint 时遇到以下异常。 'This' function is not equivalent (isomorphic)
我已经使用 nodejs 创建了库,并使用 webpack 将其捆绑,以便可以在客户端使用。 但如果我尝试将捆绑文件用于我的 Node 应用程序,它就无法工作。那么,我该如何创建同时适用于客户端和服务
我开始创建基于 Node.js 的同构 React/Redux 应用程序。该项目的一个要求是基于“移动”和“桌面” View 的特定组件的“自适应”渲染。我已经实现了 Redux Action 和缩减
关于同构通量应用程序中存储数据填充的问题。 (我使用的是 react、alt、iso 和 node,但理论适用于其他示例) 我有一个 flux 'store' ( http://alt.js.org/
我最近使用 React-Redux-Express-Mongoose 堆栈构建了一些同构/通用项目。 在我的 Mongoose 模型中包含很多业务逻辑。作为一个非常基本的示例(请原谅我的 ES6):
我是一名优秀的程序员,十分优秀!