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如何合并两个顶点/契约边 的相关文章

随机推荐

  • 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