通过允许用户选择顶点数使用 Boost 库生成图形
Posted
技术标签:
【中文标题】通过允许用户选择顶点数使用 Boost 库生成图形【英文标题】:Generating a Graph using Boost library by allowing user to select the number of vertex 【发布时间】:2012-09-15 18:09:46 【问题描述】:我想使用 boost 库生成一个图形,该库允许用户输入边数和顶点数。我基本上想做的是,
-
我希望用户输入顶点数并为每个顶点编号。
我将授予用户特权,以使用数字作为参考来选择一个顶点作为主顶点。
我希望用户在控制台中指定每个顶点的边数,并且边可以是随机的。
是否有可能使用 BGL 以某种方式实现这一点?如果是这样,一个例子将是一个很好的开始。
非常感谢,
干杯!!
【问题讨论】:
看起来你甚至不需要 BGL。 这里的唯一目标是构造一个具有指定顶点价数的随机图吗? @KerrekSB 不,生成图只是第一步,将从主节点开始对其执行各种搜索算法。网上有没有符合我标准的例子或东西? 算法并不难想出。您只需要高级描述,还是需要基本 C++ 方面的帮助? @KerrekSB 我想生成具有描述要求的图,它基本上是生成网络拓扑。我是 C++ 和 BGL 的新手。我只需要一个初始状态的示例,我想使用 BGL 来处理生成的拓扑图。非常感谢您的回复和帮助。 【参考方案1】:假设您知道 a) 基本 C++ 和 b) 基本 BGL,这里有一个简单的算法来构建具有给定顶点价数的随机无向图:
读取所需顶点的数量;称之为N
。我们有顶点集[0, N)
。
对于[0, N)
中的每个i
,读取所需的化合价v[i]
(例如存储在std::vector<int>
等容器中)。
现在有趣的部分是:迭代每个顶点并尽可能多地添加随机边。下面是一些类似 C++ 的伪代码,有空白供您填写。
for (i = 0; i != N; ++i)
if (i + 1 == N && v[i] > 0)
Error: The user input was impossible to satisfy
Abort program
while (v[i] > 0)
pick a random j in [i + 1, N)
if (v[j] > 0)
Add edge i <-> j
--v[i];
--v[j];
If we haven't aborted, we now have a random graph.
如果您想扩展其中的任何部分,请发表评论。
更新:这是一个示例实现。会有差距;这只是一个大纲。
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <cstdio>
#include <cstdlib>
int read_int(std::string const & initmsg, std::string const & repeatmsg)
std::cout << initmsg;
for (std::string line; std::getline(std::cin, line); )
std::istringstream iss(line);
int res;
if (iss >> res >> std::ws && iss.get() == EOF) return res;
std::cout << repeatmsg;
std::cerr << "Unexpected end of input! Aborting.\n";
std::exit(1);
std::string read_string(std::string const & msg)
std::string res;
std::cout << msg;
if (std::getline(std::cin, res)) return res;
std::cerr << "Unexpected end of input! Aborting.\n";
std::exit(1);
int main()
int const N = read_int("Number of vertices: ",
"I did not understand, try again. Number of vertices: ");
std::vector<unsigned int> valencies;
std::vector<std::string> vertex_names;
valencies.reserve(N);
vertex_names.reserve(N);
for (int i = 0; i != N; ++i)
std::string const msg1 = "Enter valency for vertex " + std::to_string(i) + ": ";
std::string const msg2 = "Enter description for vertex " + std::to_string(i) + ": ";
std::string const rep = "Sorry, say again: ";
valencies.push_back(read_int(msg1, rep));
vertex_names.push_back(read_string(msg2));
for (int i = 0; i != N; ++i)
std::cout << "Vertex " << i << " (\"" << vertex_names[i]
<< "\") has valency " << valencies[i] << std::endl;
// Now run the above algorithm!
【讨论】:
如果您可以扩展上面的示例,这将非常有帮助,以便我可以运行它。我在编程方面太新了,一旦得到代码,我会尝试找出其中的东西,这对我很有帮助。提前非常感谢。 我从 boost 库中提供的示例中得到了这段代码:一旦我输入了顶点的数量,我将如何为每个顶点分配数字或字母?像这样的东西在 BGL:enum A, B, C, D, E, N ; const int num_vertices = N; const char* name = "ABCDE";
但是在这个顶点是预定义的以及边缘。如何以随机方式实现它?
@Kishorepandey:等等,我会举个例子。顶点标签是一个无关紧要的细节。只需将每个顶点视为[0, N)
中的一个数字。
好的,伙计。我将等待。感谢您的帮助和回复。
@Kishorepandey:to_string
是 C++11 中的新功能,因此您需要一个现代编译器(例如 VC10 或 VC11)。或者,获取 Boost 并使用 boost::lexical_cast
。不管怎样,这只是为了信息,不是很重要。以上是关于通过允许用户选择顶点数使用 Boost 库生成图形的主要内容,如果未能解决你的问题,请参考以下文章
在 Delphi 7 中使用 C++ Boost 图形库 (BGL)