我正在为我的学习完成一项简单的编程工作,但我遇到了一个问题。赋值有一个无法修改的预定义标题,因此我必须使用已设置的结构,使问题更加复杂。
我需要实现一个函数,该函数返回从起始顶点可到达的所有顶点的向量。如果我可以使用更复杂的结构,这将是一个简单的任务,但整个图表被表示为向量的向量,让我难以理解如何做到这一点。任何帮助将不胜感激。
图形结构意味着例如图形{{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;
}
答案 0 :(得分:1)
边界以单个节点开始。从边界获取节点(如果需要循环检测:并将其添加到一组访问节点)。在节点上执行功能。然后获取可从该节点直接访问的所有节点,并将它们添加到边界(如果需要循环检测,则 :除非之前已访问过该节点)。继续,直到没有剩余节点。
取决于您如何添加&#34;到边界的节点以及你如何接受节点&#34;这是对整个搜索策略的描述。
一个队列(最后添加,从前面添加)会给你一个BFS,一个堆栈(在顶部添加,从顶部开始)会给你一个DFS。
&#34;执行功能&#34;在你的情况下是&#34;将它添加到可达节点集#34;。