使用Boost库生成图表,允许用户选择顶点数

时间:2012-09-15 18:09:47

标签: c++ boost graph boost-graph

我想使用boost库生成一个图表,允许用户输入边数和顶点数。我基本上想做的是,

  1. 我希望用户输入顶点数并为每个顶点编号。
  2. 我会授予用户使用数字作为参考选择顶点作为主顶点的权限。
  3. 我希望用户在控制台中指定每个顶点的边数和边可以是随机的。
  4. 是否有可能以某种方式使用BGL实现这一点?如果是这样,一个例子就是一个很好的开始。

    提前感谢,

    干杯!!

1 个答案:

答案 0 :(得分:2)

假设您知道a)基本C ++,以及b)基本BGL,这是一个简单的算法来构建具有给定顶点效价的随机无向图:

  1. 读取所需顶点的数量;称之为N。我们有顶点集[0, N)

  2. 对于i中的每个[0, N),请阅读所需的合价v[i](例如存储在std::vector<int>等容器中。

  3. 现在有趣的部分:迭代每个顶点并尽可能地添加随机边缘。这里有一些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.
    
  4. 如果您想要扩展此任何部分,请发表评论。


    更新:以下是一个示例实现。会有差距;这只是一个大纲。

    #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!
    }