我想在图表中添加随机边缘,如下所示:
#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个值顶点。我怎样才能做到这一点?
答案 0 :(得分:1)
编辑:当我的意思是“无序配对”时,我说“有序配对”!希望现在的改写更加清晰。
您需要做的是从无序对的非负整数对的替换中取样而不是&lt; N.由于计算机比无序对更容易表示有序对,因此生成此集合的通常方法是生成第一个元素小于第二个元素的所有有序对:
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。