Graph C ++的实现(节点是字符)

时间:2015-12-09 07:24:07

标签: c++ graph stl depth-first-search breadth-first-search

我有两个类,一个是Graph.h和Vertex.h(有向图)

#ifndef VERTEX_H                              #ifndef GRAPH_H
#define VERTEX_H                              #define GRAPH_H


#include <iostream>                          #include "vertex.h"
#include <vector>                            using namespace std;

using namespace std;                         class Graph {

class Vertex {                               private:

private:                                     vector<Vertex> vertices;
vector<char> edges;                          
char label;

public:                                     public:

Vertex(char);                               void addEdge(char,char);
void addEdge(char);                         int vertexCount();
char getLabel();                            bool vertexExists( char );
const vector<char> getEdges();              bool pathExists( char, char );

};                                          };

#endif /* vertex_h */                       #endif /* graph_h */

我已经使用bfs解决了它,但我认为使用dfs会有更高效的解决方案。 我插入了一些节点进行测试,

graph = new Graph();

graph->addEdge( 'P', 'R' );
graph->addEdge( 'P', 'W' );
graph->addEdge( 'Q', 'X' );
graph->addEdge( 'R', 'X' );
graph->addEdge( 'S', 'T' );
graph->addEdge( 'T', 'W' );
graph->addEdge( 'W', 'S' );
graph->addEdge( 'W', 'Y' );
graph->addEdge( 'Y', 'R' );
graph->addEdge( 'R', 'Z' );

如果sketched看起来像this

,我会实现

我的问题是如何执行DFS / BFS以查看P-> T之间是否存在路径。

1 个答案:

答案 0 :(得分:0)

广度优先或深度优先是否更有效将完全取决于图表的拓扑。广度优先方法将找到到节点的最短路径(在导航中有用,但在var obj = []; var data = {}; for (var i = 0; i < elements.length; i++) { data = { userId: elements[i].id }; obj.push(data); } // [ {userId: 1}, {userId: 2} ... ] 中没有用),但不要将其与以最短移动次数找到路线混淆。

在这两种情况下,您都会记录已访问过的节点,如果图表很大(通常适用pathExists,则通常为位图。)

而且,在这两种情况下,你都会保留一个&#34;列表&#34;接下来要访问的顶点最初列表仅包含起始点,但是当您访问每个顶点时,您将连接的顶点添加到列表中(如果尚未访问)。

在广度优先搜索的情况下,顶点列表作为队列运行,其中新的顶点被添加到列表的尾部。

在深度优先搜索的情况下,顶点列表作为堆栈操作,其中新顶点被添加到列表的头部。可以省去显式列表,并通过函数递归使用调用堆栈来隐式保存列表。

当您找到目标顶点或堆栈/队列为空时(在这种情况下没有路径),搜索结束。