C++数据结构之Graph的实现/深搜/广搜/top排序/双连通分量分解/Dij/Prim

摘要

  1. class Graph包含了:ADT(纯虚函数)+ algorithm。

  2. 纯虚函数的功能:使算法脱离图的具体实现,举例:status(i) parent(i) nextNbr(i)

  3. 所以在本章中,感觉上有的算法效率很低(如,pfs),那是因为还没有用上最适合这个算法的数据结构。

  4. 代码以有向图的方式实现。如果是无向图,就要加双向边。top排序要避免把一条双向边判为环(加一句话即可)

  5. class GraphMatrix 邻接矩阵 包含了:ADT的具体实现

  6. GraphMatrix::remove() 删除完边的第i行之后马上删掉V的第i个元素,否则对应不上了

  7. vector<T>::remove()的返回值如果设计的不是删除值,删之前先备份成tmp,就等效了

边和顶点的几种状态(在搜索算法中用到)

顶点状态

typedef enum{
    
    UNDISCOVERED, DISCOVERED, VISITED} Vstatus;

刚一从遍历树的父节点发展到当前节点时,当前节点状态由UNDISCOVERED转为UNDISCOVERED

dfs:当前节点的后代节点成为VISITED了,则当前节点的状态由DISCOVERED转为VISITED
bfs:当前节点的儿子们都进队了,则当前节点的状态由DISCOVERED转为VISITED

边类型

typedef enum{
    
    UNKNOW, TREE, CROSS} Etype;

UNKNOW —————— 尚不确定
TREE ———————— 树边
CROSS ——————— 跨边(边指向节点访问完毕且访问时间早)
BACKWARD —————回边(边指向节点还在访问中)(证明该图是有环图)
FORWARD ——————前向边(边指向节点访问完毕且访问时间晚)

看着CORSS与FORWARD是相反的,实际上不是。F连接的是祖先和直接后代,C连接的是姑表亲。B连接的也是祖先和直接后代

广搜———————————UNKNOW、TREE 、CROSS
深搜无向图————————UNKNOW、TREE 、BACKWARD
深搜有向图————————UNKNOW、TREE 、CROSS 、BACKWARD、FORWARD

struct Vertex

struct Edge

抽象模板类 Graph

深搜/广搜/top排序

双连通分量分解

Dij/Prim

邻接矩阵GraphMatrix的具体实现

猜你喜欢

转载自blog.csdn.net/weixin_45339670/article/details/131915630