由矢量矢量组成的有向图中的可达顶点

时间:2016-10-31 00:13:24

标签: c++ vector graph vertices

我正在为我的学习完成一项简单的编程工作,但我遇到了一个问题。赋值有一个无法修改的预定义标题,因此我必须使用已设置的结构,使问题更加复杂。

我需要实现一个函数,该函数返回从起始顶点可到达的所有顶点的向量。如果我可以使用更复杂的结构,这将是一个简单的任务,但整个图表被表示为向量的向量,让我难以理解如何做到这一点。任何帮助将不胜感激。

图形结构意味着例如图形{{1,2,3}, {3}, {3}, {}}表示顶点0通向顶点1,2,3;顶点1导致3,顶点2导致3,顶点3导致无处。

graph.hpp

#include <vector>
#include <algorithm>

/*
 * Struct representing graph, that is, vertices and edges between the vertices.
 * Vertices are identified with indices, where 0 stands for 1st added vertex,
 * 1 stands for 2nd added vertex, 2 stands for 3rd added vertex, etc...
 *
 * The edges between vertices are directed.
 */
struct graph {
    std::vector<std::vector<int>> connections;
};

// Other functions manipulating the graph here

/*
 * Return vertices that are reachable from given vertex.
 * That is, the vertex itself,
            all vertices connected to the given vertex,
            all vertices connected to these vertices,
            etc...
 *
 * Can only be called with existing vertex.
 */
std::vector<int> reachable_vertices(const graph& g, int vertex);

我尝试过一种天真的蛮力方法,但它没有用。

graph.cpp

#include "graph.hpp"

// Other functions manipulating the graph here

std::vector<int> reachable_vertices(const graph& g, int vertex) {
    if (g.connections.size() < vertex) {
        return{};
    }
    std::vector<int> reachables;
    for (auto vert : g.connections[vertex]) {
        if (vert > vertex) {
            reachables = reachable_vertices(g, vert);
        }
    }
    reachables.push_back(vertex);
    std::sort(reachables.begin(), reachables.end());
    reachables.erase(std::unique(reachables.begin(), reachables.end()), reachables.end());
    return reachables;
}

1 个答案:

答案 0 :(得分:1)

边界以单个节点开始。从边界获取节点(如果需要循环检测:并将其添加到一组访问节点)。在节点上执行功能。然后获取可从该节点直接访问的所有节点,并将它们添加到边界(如果需要循环检测,则 :除非之前已访问过该节点)。继续,直到没有剩余节点。

取决于您如何添加&#34;到边界的节点以及你如何接受节点&#34;这是对整个搜索策略的描述。

一个队列(最后添加,从前面添加)会给你一个BFS,一个堆栈(在顶部添加,从顶部开始)会给你一个DFS。

&#34;执行功能&#34;在你的情况下是&#34;将它添加到可达节点集#34;。