摘要
-
class Graph
包含了:ADT(纯虚函数)+ algorithm。 -
纯虚函数的功能:使算法脱离
图的具体实现
,举例:status(i)
parent(i)
nextNbr(i)
-
所以在本章中,感觉上有的算法效率很低(如,pfs),那是因为还没有用上最适合这个算法的数据结构。
-
代码以有向图的方式实现。如果是无向图,就要加双向边。top排序要避免把一条双向边判为环(加一句话即可)
-
class GraphMatrix
邻接矩阵 包含了:ADT的具体实现 -
GraphMatrix::remove()
删除完边的第i行之后马上删掉V的第i个元素,否则对应不上了 -
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