通过允许用户选择顶点数使用 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 库生成图形的主要内容,如果未能解决你的问题,请参考以下文章

通过 SWIG 从 Ruby 调用 Boost?

在 Delphi 7 中使用 C++ Boost 图形库 (BGL)

如何计算缩小到一个图形中的顶点数?

使用 Boost 图形库:boost::mutable_queue 中的 property_map

将网络分解为具有相等顶点数的组件

Boost 的多精度模拟低精度快速浮点数