使用Boost图表更改尺寸图

时间:2015-11-29 21:46:46

标签: c++ boost graph

您好我是Boost图书馆的新手。我想从一个方形的二维地图构建一个图形,用于星形算法(地图是一个阵列,墙面和普通地形都是1和0)。

图表应该是无向的,并随地图的大小而变化。每个节点有8条边(除了地图的边)。

我已经完成了一些示例,但我不了解构建此大小的图形的过程,因为大多数示例在boost图库文档中看起来像这样(看起来如下)。

非常感谢任何帮助或想法

B

1 个答案:

答案 0 :(得分:1)

在第二次阅读问题时,您的问题似乎就是如何添加节点和边缘。

这是一个查询行数/列数的起点,并创建方形“网格”。我在侧面使用nodes矩阵,可以轻松地从网格中的(x,y)查找到图中的顶点描述符。

<强> Live On Coliru

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graph_utility.hpp>
#include <iostream>

using namespace boost;

struct Point {
    int x, y; 
    friend std::ostream& operator<<(std::ostream& os, Point p) {
        return os << "[" << p.x << "," << p.y << "]";
    }
};

int main() {
    using std::vector;
    using Graph             = adjacency_list<setS, vecS, undirectedS, Point>;
    using vertex_descriptor = Graph::vertex_descriptor;

    Graph lattuce;

    int num_rows;
    if (!(std::cin >> num_rows && num_rows > 0))
        return 255;

    vector<vector<vertex_descriptor> > nodes(num_rows, vector<vertex_descriptor>(num_rows));

    for (auto i = 0; i < num_rows; ++i)
        for (auto j = 0; j < num_rows; ++j)
            nodes[i][j] = add_vertex(Point{i,j}, lattuce);

    auto is_valid = [num_rows](Point p) { return (p.x >= 0 && p.x < num_rows) && 
                                                 (p.y >= 0 && p.y < num_rows); };

    for (auto vd : make_iterator_range(vertices(lattuce))) {
        auto p = lattuce[vd];

        for (Point neighbour : {
                Point { p.x - 1, p.y - 1 }, Point { p.x - 1, p.y + 0 }, Point { p.x - 1, p.y + 1 },
                Point { p.x + 0, p.y - 1 }, Point { p.x + 0, p.y + 1 },
                Point { p.x + 1, p.y - 1 }, Point { p.x + 1, p.y + 0 }, Point { p.x + 1, p.y + 1 },
            })
        {
            if (is_valid(neighbour))
                add_edge(nodes[neighbour.x][neighbour.y], vd, lattuce);
        };
    }

    print_graph(lattuce, get(vertex_bundle, lattuce));
}

打印,例如输入3

[0,0] <--> [0,1] [1,0] [1,1] 
[0,1] <--> [0,0] [0,2] [1,0] [1,1] [1,2] 
[0,2] <--> [0,1] [1,1] [1,2] 
[1,0] <--> [0,0] [0,1] [1,1] [2,0] [2,1] 
[1,1] <--> [0,0] [0,1] [0,2] [1,0] [1,2] [2,0] [2,1] [2,2] 
[1,2] <--> [0,1] [0,2] [1,1] [2,1] [2,2] 
[2,0] <--> [1,0] [1,1] [2,1] 
[2,1] <--> [1,0] [1,1] [1,2] [2,0] [2,2] 
[2,2] <--> [1,1] [1,2] [2,1]