当前位置: 首页 > 知识库问答 >
问题:

遍历升压图显示“隐藏”节点

仲璞瑜
2023-03-14

我开始尝试boost graph类。为此,我创建了一个简单的示例,如下所示。当通过深度优先搜索算法遍历图形时,我没有添加一个节点。代码如下:

#include <boost\graph\adjacency_list.hpp>
#include <boost\graph\depth_first_search.hpp>
#include <iostream>

typedef boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS> GraphType;
typedef boost::graph_traits<GraphType>::vertex_descriptor VertexType;

class VertexVisitor : public boost::default_dfs_visitor
{
public:
  void discover_vertex(VertexType v, GraphType g)
  {
    std::cout << v << std::endl;
  }
};

int main() 
{ 
  GraphType g;
  boost::add_edge(1,2,g);
  boost::add_edge(1,3,g);
  boost::add_edge(2,3,g);
  boost::add_edge(1,4,g);
  boost::add_edge(4,5,g);

  VertexVisitor vis;
  boost::depth_first_search(g, boost::visitor(vis));

  return 0;
}

这个的输出是

0
1
2
3
4
5

但是0从何而来,我从未添加过它?这是某种虚拟节点吗?但如果是这样,为什么在遍历时访问它,如何实现所需的行为?

编辑1:经过尝试,PlasmaHH建议,并通过我发现的提升代码进行调试,提升::add_edge调用图的顶点结构的调整大小。因此,搜索算法添加和访问了更多的元素,尽管它们彼此没有连接。顺便说一句:我正在使用提升1.47。

编辑2:它表明,depth\u first\u searchwidth\u first\u search-算法的行为(除了其固有的差异)不同,因为DFS会遍历图中的所有节点,即使它们没有连接。我看不出这有什么好处,因为我只想找到一条从一个节点到另一个节点的路径,这条路径连接到这个节点,但没问题。如前所述,我的问题的解决方案是使用BFS算法,它不会遍历所有子图。对于那些感兴趣的人,我添加一个小例子:

#include <boost\graph\adjacency_list.hpp>
#include <boost\graph\depth_first_search.hpp>
#include <boost\graph\breadth_first_search.hpp>
#include <iostream>

typedef boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS>  GraphType;
typedef boost::graph_traits<GraphType>::vertex_descriptor VertexType;

class DFSVertexVisitor : public boost::default_dfs_visitor
{
public:
  void discover_vertex(GraphType::vertex_descriptor v, GraphType g)
  {
    std::cout << v << std::endl;
  }
};

class BFSVertexVisitor : public boost::default_bfs_visitor
{
public:
  void discover_vertex(GraphType::vertex_descriptor v, GraphType g)
  {
    std::cout << v << std::endl;
  }
};


int main(int argc, char *argv[])
{
  GraphType g;
  boost::add_edge(1, 2, g);
  boost::add_edge(2, 3, g);
  boost::add_edge(1, 3, g);
  boost::add_edge(4, 5, g);

  std::cout << "Performing BFS" << std::endl;
  BFSVertexVisitor bfsVisitor;
  boost::breadth_first_search(g, boost::vertex(1, g), boost::visitor(bfsVisitor));

  std::cout << "Performing DFS" << std::endl;
  DFSVertexVisitor dfsVisitor;
  boost::depth_first_search(g, boost::visitor(dfsVisitor).root_vertex(1));

  return 0;
}

请注意,节点4和5未连接到节点1、2和3!

输出:

Performing BFS
1
2
3
Performing DFS
1
2
3
0
4
5

编辑3:我不得不重新考虑。与我连接的add_edge不是节点本身,而是它们的索引,正如刚才n.m建议的那样。因此,我认为仅仅添加边并不是最终的解决方案,因为删除其中一个顶点并不能像预期的那样工作。

共有1个答案

高祺
2023-03-14

从留档:

如果图的顶点列表是vecS,则该图具有通过vertex_index_t属性的属性映射访问的内置顶点索引。这些指数位于[0,num_vertices(g))范围内,并且是连续的。当一个顶点被移除时,索引会被调整以保留这些属性。

我不认为文档明确地说,vertex\u descriptor只是索引。文档中的一些示例表明,情况确实如此。其他示例将顶点描述符视为黑盒。

 类似资料:
  • 主要内容:实例,jQuery hide() 和 show(),实例,实例,实例,jQuery toggle(),实例隐藏、显示、切换,滑动,淡入淡出,以及动画,哇哦! 因为时间是宝贵的,我们提供快捷方便的学习方法。 在小牛知识库,你可以学习需要的知识。 实例 jQuery hide() 简单的jQuery hide()方法演示。 jQuery hide() 另一个hide()实例。演示如何隐藏文本。 jQuery hide() 和 show() 通过 jQuery,您可以使用 hide() 和

  • 我用高图构建了一个网络图,我正在努力找到一种方法来轻松地“扩展”或“显示”节点的子节点。我遇到的问题是,数据的声明方式是非常线性的。它实际上没有太多的层次结构。 这是我到目前为止的一支笔https://codepen.io/anon/pen/xvGMwa.我的问题是“链接”与节点没有关联。所以我很难找到一组节点及其链接并隐藏/显示它们。 我希望它只从前4个节点开始,然后能够单击节点上的一个动作来显

  • 排除不显示字段 Model.findAll({ attributes: { exclude: ['baz'] } });

  • 提供显示/隐藏元素的功能。 标题 内容 类型 通用 支持布局 responsive,fixed-height,fill,container,fixed 所需脚本 https://c.mipcdn.com/static/v2/mip-toggle/mip-toggle.js 示例 基本使用 你可以使用事件 toggle, show 或 hide 以控制 mip-toggle 组件的显示与隐藏。 <b

  • 我一直试图隐藏GridLayout 3x3板的所有图像视图。我尝试使用循环来迭代布局和ImageView.SetImagedRawable(null)的所有子级; 注意:下面的代码被放置在playAgain(View View)按钮方法中。 按下按钮后,应用程序显示此错误 以下是Logcat的日志:

  • 问题内容: 按下后如何隐藏“编辑”链接?当我按下编辑键时,是否还可以隐藏“ lorem ipsum”文本? 问题答案: