图C++的实现(节点是字符)
Implementation of Graph C++ (nodes are characters)
我有两个类,一个是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' );
我的实施,如果草图将看起来像这个
我的问题是,我将如何执行DFS/BFS,以查看p->T之间是否存在路径。
广度优先还是深度优先更有效完全取决于图的拓扑结构。广度优先方法将找到到达节点的最短路线(在导航中有用,但在pathExists
中不有用),但不要将其与在最短移动次数中找到路线混淆。
在这两种情况下,您都会保存访问过哪些节点的记录,如果图形很大,则通常为位图(std::vector<bool>
通常适用)。
而且,在这两种情况下,您都会维护一个下一步要访问的顶点的"列表"。最初,该列表仅包含起点,但在访问每个顶点时,如果尚未访问,则会将连接的顶点添加到列表中。
在广度优先搜索的情况下,顶点列表被操作为队列,其中新的顶点被添加到列表的尾部。
在深度优先搜索的情况下,顶点列表被操作为堆栈,其中新的顶点被添加到列表的头部。可以省去显式列表,并通过函数递归使用调用堆栈来隐式保存列表。
当您找到目标顶点时,或者当堆栈/队列为空时(在这种情况下没有路由),搜索就结束了。
相关文章:
- 反向给定链表中的K节点
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 指向指向字符数组的指针数组的指针
- 如何用转义符替换字符串中的所有特殊字符
- Boost Graph Library,修复节点大小
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 为什么我所有的节点都指向同一个字符数组
- XML从UnicodeString创建CData节点时出现无效字符
- 节点缓冲区到字符数组
- 获取列表<节点*>中的字符并返回
- 图C++的实现(节点是字符)
- 为什么 g++ 在将节点指向数据字符时返回'Segmentation fault'错误?