Boost.Graph如何合并两个顶点/契约边

2023-11-24

如何在 Boost.Graph 中合并两个顶点/契约边?

我需要将边从顶点 A 移动到顶点 B,并删除顶点 A - 有内置函数吗?或者adjacency_list可能有一些特殊的东西?

如果没有这样的功能——那为什么呢?我认为这是常见的图形操作。

EDIT:我确实知道可以手动执行此操作,但存在一些极端情况(例如保留边缘属性),这就是为什么它是库中的良好候选者。

我最感兴趣的是知道 Boost.Graph 是否已经有这个操作(也许有一些奇特的名字?)。如果不是 - 为什么这样的原始操作/算法不存在Graph图书馆。也许我遗漏了一些东西,并且该操作不是原始的或很少使用的。

我不需要半生不熟的快速概念验证


半生不熟的快速概念验证

您可以使用add_edge() and remove_vertex()在根据以下定义的图上adjacency_list

#include <iostream>
#include <iterator>
#include <boost/graph/adjacency_list.hpp>

using V = unsigned;
using E = std::pair<V, V>;
using G = boost::adjacency_list<boost::vecS, boost::vecS>;

void print_graph(G const& g)
{
    auto vs = boost::vertices(g);
    for (auto vit = vs.first; vit != vs.second; ++vit) {
        auto neighbors = boost::adjacent_vertices(*vit, g);
        for (auto nit = neighbors.first; nit != neighbors.second; ++nit)
            std::cout << "{" << *vit << "," << *nit << "}" << ", ";
    }
    std::cout << "\n";
}

void contract_vertices(V b, V a, G& g)
{
    auto be = boost::adjacent_vertices(b, g);
    for (auto beit = be.first; beit != be.second; ++beit)
        add_edge(a, *beit, g);
    remove_vertex(b, g);
}

int main()
{
    // named vertices
    auto const A = V { 1 };
    auto const B = V { 2 };

    // construct the graph
    auto e = std::vector<E> { { A, 3 }, { B, 4 } };
    auto g = G { std::begin(e), std::end(e), 4 };

    print_graph(g);
    contract_vertices(B, A, g);    
    print_graph(g);
}

实例打印

{1,3}、{2,4}、
{1,2}、{1,3}、

输出并不完全符合您的预期,因为顶点的标签也已更新以反映删除B,这导致节点 3 和 4 现在被标记为 2 和 3。

库质量代码的要求

用于顶点收缩的通用库质量算法u and v通常应该至少考虑以下极端情况

  • 删除 (u,v) 和 (v,u) 边;
  • 将所有 u 和 v 出边与共同目标合并;
  • 将所有 u 和 v 边与公共源合并;
  • 将剩余的 u 出边移至 v;
  • 将 u 的其余边移动到 v;

Boost.Graph 提供了此类操作所需的所有原语:in_edges(), out_edges(), add_edge(), clear_vertex(), remove_vertex()。对于无向图,其中几个项目可以在一个步骤中完成,而对于有向图,通常需要两个步骤。

除了这些算法步骤之外,还应该定义合并或移动边缘的语义。例如。他们的财产应该怎样处理?这类似于例如合并两家公司:合资公司应以哪个名称运营?

为什么 Boost.Graph(还)没有提供contract_vertices()

TL;DR我不知道。但我可以推测。主要是,应该指定一个假定的接口contract_vertices()。除了要收缩的两个顶点以及它们所属的图的类型之外,还应该定义边属性上的合并和移动操作。理论上,应该可以使用适合通用算法的模板参数来做到这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Boost.Graph如何合并两个顶点/契约边 的相关文章

  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐

  • Java 8 拆分字符串并在 Map 内创建 Map

    我有一个像这样的字符串101 1 5 101 2 4 102 1 5 102 2 5 102 3 5 103 1 4 我想将其添加到Map
  • 使用 r 中的 ggplot 将数据框的 n 列绘制为线条

    我正在尝试重新创建 P lya 瓮模型 https en wikipedia org wiki P lya urn model 在 R 中 使用 ggplot 该模型基本上从 瓮 中的 1 个白色球和 1 个黑色球开始 然后随机选择一个球并
  • generic.xaml 文件位于哪里?

    如果你想使用默认的样式 颜色等 你需要从通用 xaml附带的文件Windows应用程序开发工具包NuGet 包 因此问题是 通用 xaml file 你可以找到默认的通用 xaml每个里面Windows应用程序开发工具包NuGet 包文件夹
  • 如何在 Xcode 8 中启用可视内存调试器?

    我将一个项目从以前版本的 Xcode 迁移到 Xcode 8 我想要的是使用新的可视内存调试器 它在新项目中可用 但在我导入的项目中完全缺失 为什么是这样 Visual Memory Debugger 似乎需要 Swift 3 才能工作 我
  • 无需 PIN/密码即可从 PKCS11 智能卡获取证书

    摘要 当在 OpenSC 上使用 JCA over PKCS11 时 提取证书时需要 PIN 我有一个需要使用智能卡签名的应用程序 该智能卡受 OpenSC 支持 因此我使用 Java 内置的 pkcs11 包装器提供程序来使用它 出于功能
  • PKG 生成字节码失败

    当我尝试运行 pkg index js t macOS 时收到此警告 节点 v17 3 1 电子邮件受保护 警告无法为文件 snapshot index js 制作字节码node17 arm64 希望有人能帮忙 我也尝试过使用 b 并得到
  • JMF更换

    JMF 很旧 不能正确支持很多编解码器 这些天我在后台使用 FFMPEG 但我想切换到本机 java 解决方案 如果存在 有人知道当前具有媒体操作功能的开源 Java 项目吗 虽然不是 100 原生 但您也可以使用Xuggler 它是一个开
  • 如何防止文档正文上的点击事件(也许是 Cordova 中的错误?)

    我是一名初学者 尝试使用 Kinetic Js 和 phonegap build 开发手机游戏 我遇到了一个我不知道如何解决的问题 我做了一些测试 我刚刚粘贴了这段代码在这里进入我的index html并将代码发送到音隙构建它从 html
  • 为什么Tomcat不会绑定关闭端口(8005)?

    Tomcat 启动并运行得很好 但从未绑定到 8005 关闭端口 所以 我只能以杀死它的方式来结束它 我正在启动 Tomcat catalina sh start or startup sh 结果是相同的 Server xml 片段
  • 当最终链接隐藏时,下载保留原始文件名的文件

    我需要下载一个文件 将其保存在一个文件夹中 同时保留网站上的原始文件名 url lt http www seg social es prdi00 idcplg IdcService GET FILE dID 187112 dDocName
  • Python xlrd:抑制警告消息

    我在用xlrd处理 Excel 文件 我正在包含许多文件的文件夹上运行脚本 并且正在打印与这些文件相关的消息 但是 对于我运行的每个文件 我还会收到以下 xlrd 生成的错误消息 WARNING OLE2 inconsistency SSC
  • 如何高效地从 HashMap 中查找和插入?

    我想做以下事情 查找一个Vec对于某个密钥 并存储它以供以后使用 如果不存在则创建一个空的Vec为键 但仍将其保留在变量中 如何有效地做到这一点 我自然认为我可以使用match use std collections HashMap Thi
  • Chrome 版本 66:阻止当前来源接收跨站点文档

    在我的本地计算机上 我一直在使用 disable web security user data dir 禁用网络安全 升级到 Chrome 版本 66 后 我开始收到阻止当前来源接收跨站点文档的警告 如何禁用此版本 chrome 的网络安全
  • 使用 ref-qualifiers 成员函数重载的调用不明确

    在编译我的代码时 我发现了一个奇怪的行为G gcc4 8 1 和MinGW4 8 2 与 std gnu 1y旗帜 本着 SSCCE 的精神 我隔离了以下片段 struct C template lt typename X gt auto
  • 确保 Linux 中应用程序的单个实例

    我正在 WxPython 中开发 GUI 应用程序 我不确定如何确保在任何给定时间机器上只有应用程序的一个副本正在运行 由于应用程序的性质 多次运行没有任何意义 并且很快就会失败 在 Win32 下 我可以简单地创建一个命名互斥体并在启动时
  • VS 2017 通过文件路径引用本地项目(就像在 VS 2015 中使用 global.json 一样)

    在 VS 2015 中 我们曾经能够在 global json 中指定本地路径 如下所示 projects src test C path to other projects 然后 它将将该路径中的所有项目添加到当前解决方案中 使我们能够轻
  • 如何在 capistrano 中使用 --trace 运行 rake?

    我希望 capistrano 使用 trace 调用 rake 这样我就可以找出它失败的原因 我该怎么做呢 set rake rake trace 不起作用 我发现的最好的方法是 set rake rake trace 这样你就不会覆盖ra
  • React JS 按升序和降序排序

    我一直在使用sortBy from lodash 但继续得到 src components Product js Syntax error Unexpected token 17 29 15 sortByPrice 16 this setS
  • PyTorch 和 CUDA 驱动程序

    我安装了 CUDA 9 2 例如 base c gt nvcc version nvcc NVIDIA R Cuda compiler driver Copyright c 2005 2018 NVIDIA Corporation Buil
  • Boost.Graph如何合并两个顶点/契约边

    如何在 Boost Graph 中合并两个顶点 契约边 我需要将边从顶点 A 移动到顶点 B 并删除顶点 A 有内置函数吗 或者adjacency list可能有一些特殊的东西 如果没有这样的功能 那为什么呢 我认为这是常见的图形操作 ED