【问题标题】:Adding random edges in a graph generated using BOOST graphical library在使用 BOOST 图形库生成的图中添加随机边
【发布时间】:2012-09-18 14:35:43
【问题描述】:

我想在我的图中添加随机边,如下:

#include <iostream>
#include <utility>                   // for std::pair
#include <algorithm> 
#include <boost/graph/adjacency_list.hpp>
#include "boost/graph/topological_sort.hpp"
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/graphviz.hpp>

int main()
{
    using namespace std;
    using namespace boost;

    typedef adjacency_list< listS, vecS, undirectedS > undigraph;

    int const N = read_int_from_user("Number of vertices: ");   

    undigraph g(N);

    // add some edges,             // #1
    for (int i = 0; i != N; ++i)
    {
        for (int j = 0; j != N; ++j)
        {
            add_edge(i, j, g);
        }
    }
    write_graphviz(cout, g);
}

#1 之后的行就是这样做的。

但是正如您所看到的,每个顶点存在 8 条边,但我希望最多只有 4 条,并且希望以随机方式连接所有顶点,最重要的是,每个顶点只能有 4 个化合价顶点。我怎样才能做到这一点?

【问题讨论】:

  • 84 的数字从何而来?!
  • 我想说的是,您似乎对任何细节都非常松懈......这不是“BOOST”而是“Boost”,并且它不是“图形库”,而是 graph 库。这是一个小问题,但你显然在这个项目上苦苦挣扎,我想提醒你,如果你不努力把小细节做好,你会发现把所有东西放在一起是一个巨大的挑战。
  • @KerrekSB 是的,我确实在这个项目上苦苦挣扎,而且我的截止日期非常接近。我肯定会更多地提高我的基本技能,并会考虑你的话。非常感谢您的建议。
  • 您找到解决方案了吗?如果下面的答案是您想要的答案,请接受;)

标签: c++ boost graph boost-graph


【解决方案1】:

编辑:当我的意思是“无序对”时,我说的是“有序对”!希望现在改写更清楚。

您需要做的是从所有 无序

vector<pair<int, int> > pairs;

for (int i = 0; i < N; ++i) {
    for (int j = i + 1; j < N; ++j) {
        pairs.push_back(make_pair(i, j));
    }
}

例如如果 N = 4,则要考虑的可能边集是:

0, 1
0, 2
0, 3
1, 2
1, 3
2, 3

使用reservoir sampling 是从该集合中采样的好方法。

【讨论】:

  • 感谢您的回复。如我所见,上面的代码创建了一个pair(i,j)。但不可能在add_edges(i,j,g) 中使用对,因为它需要单独的 i 和 j 值。那么在我可以在add_edges() 中使用它们之前,是否可以将它们分开
  • @Kishorepandey:当然,你可以在制作完一个pair 之后将这两个部分都拿出来,否则它不会有太大用处! :-P A pair&lt;int, int&gt; 只是一个 struct 包含 2 个成员,firstsecond。所以例如cout &lt;&lt; "The first pair is " &lt;&lt; pairs[0].first &lt;&lt; ", " &lt;&lt; pairs[0].second &lt;&lt; endl;
  • 我试过了,但我没有得到上面的输出。我得到了所有的优势,比如:(0,0), (0,1), (0,2), (0,3),(1,1)..and so on until(4,4) for N=4。但我真的很想拥有你上面提到的东西。
  • 我的代码是这样的vector&lt;pair&lt;int, int&gt; &gt;pairs; pairs.push_back(make_pair(i, j));add_edge(pairs[0].first, pairs[0].first , g);我在这里做错了吗?
  • @Kishorepandey:看起来你正在将边添加到同一个循环内的图形中,因为你正在构建所有可能边的向量......你应该(1)构建所有可能的边,然后 (2) 水库从该向量中采样一些数量(例如 k)边以生成另一个包含要实际包含的随机边的向量,然后最后 (3) 使用 add_edges() 将这些边添加到图中。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2013-12-09
  • 1970-01-01
  • 2017-11-20
相关资源
最近更新 更多