【问题标题】:Store the EdgeList as a unordered_set on Boost Graph Library将 EdgeList 存储为 Boost Graph Library 上的 unordered_set
【发布时间】:2015-10-14 18:35:32
【问题描述】:

我正在重现一个科学实验,我需要将图的边集存储为 unordered_set。我正在尝试使用 BGL adjacency_graph,我认为最后一个参数将是 hash_setS 而不是 listS。但是当我这样做时,我的程序无法正常工作。我在这里看到了一个类似的问题,有人说要调整结构数据以对 BGL 的 de EdgeListGraph 进行建模,但我什至不知道该怎么做。

有人可以帮忙吗?谢谢。

【问题讨论】:

  • 哇。只需发布不起作用的代码。否则答案是“是的,有人可以帮忙”,然后
  • 嘿嘿,谢谢你的回复。我不知道我做了什么,但它现在看起来可以工作,但我不记得我改变了什么。不过,我会把代码放在这里...再次感谢您的回复。

标签: boost-graph unordered-set


【解决方案1】:
using namespace std;

typedef boost::property<boost::edge_weight_t, double> EdgeWeightProperty;
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, boost::no_property, EdgeWeightProperty, boost::hash_setS> Graph;

int main()
{

ifstream arquivo_in ("shrd150-3.dis");
ofstream arquivo_out ("matriz.txt");

int numero, j, i;
Graph g(15);
EdgeWeightProperty e;
enum { A, B, C, D, E, F, G, H, I, J, K, L, M, N, O };
const char name[] = "ABCDEFGHIJKLMNO";

boost::property_map<Graph, vertex_index_t>::type
vertex_id = get(vertex_index, g);
boost::property_map<Graph, edge_weight_t>::type
trans_delay = get(edge_weight, g);

j = 1;

for(i = 0; i < 15; ++i)
    Graph::vertex_descriptor i = boost::add_vertex(g);


for(j = 1; !arquivo_in.eof(); ++j)
{
    for(i = 0; i < j; ++i)
    {
        arquivo_in >> numero;
        e = numero;
        boost::add_edge(i, j, e, g);
    }
}

我不确定是否存储为 hash_set,但我会尝试一种检查冲突的方法。再次感谢!

【讨论】:

  • 您的意思是“检查唯一性约束”对吗?因为哈希表不应该泄露冲突信息。
【解决方案2】:

我不知道您为什么需要“unordered_map”存储(您从未提到过)。但是既然你说:

我不确定是否存储为 hash_set,但我会尝试一种检查冲突的方法

我得到的印象是您只想防止重复边缘。在这种情况下,只需将setS 用于OutEdgeList 容器选择器。

此容器控制如何存储每个顶点的出边。如果它们是唯一的,则根据定义,该图将不包含重复的边。

注意,如果图形模式是undirectedS,那么Boost Graph Library 将对源/目标顶点进行排序,使得(0,1)(1,0) 边在这里是等价的/

演示

*Live On Coliru**

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

typedef boost::property<boost::edge_weight_t, double> EdgeWeightProperty;
typedef boost::adjacency_list<boost::setS, boost::vecS, boost::undirectedS, boost::no_property, EdgeWeightProperty, boost::hash_setS> Graph;

int main()
{
    Graph g(15);

    assert( add_edge(0,1,g).second);
    assert( add_edge(1,2,g).second);
    assert( add_edge(0,2,g).second);
    assert( add_edge(0,3,g).second);
    assert(!add_edge(3,0,g).second);
}

【讨论】:

  • 您好。在我的实验中,我需要保证边缘下的大部分操作都将在恒定时间内完成。我将在非常大的图表实例上对其进行测试。我仍然不确定的是,如果使用 hash_setS 作为最后一个参数,我会在恒定时间内获得边缘集下的操作,以及如何检查冲突。无论如何,我很高兴得到您的关注,并将继续努力。谢谢
猜你喜欢
  • 1970-01-01
  • 2019-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 2016-09-19
相关资源
最近更新 更多