1. 图的表示:
1. 邻接链表:稀疏图;
2. 邻接矩阵:稠密图;
2. 广度优先搜索
(1) 算法思想:
1. 初始化结点、队列;同时根结点入队;
2. 出队操作,同时将所有该结点的未被访问到的相邻结点入队;
3. 队列为空则算法结束。
(2)伪代码:
第一部分:初始化每个结点,队列;
第二部分:
while Q!=null
u=DeQueue(Q);
for v in G.Adj[u]
if v.color=white
v.color=GRAY;
v.d=v.d+1;
v.f=u;
EnQueue(Q,v);
End if
u.color=BLACK‘
End while
(注:color 属性标记是否访问,d属性记录根到该结点的最短路径,f属性构建广度优先树)
(3)应用:最短路径计算;广度优先树。
2.深度优先搜索
(1)算法思想:
1. 初始化结点、全局时间计数器;
2. 对每个结点进行检查,然后使用DFS-VISIT(G,u)遍历;
3. DFS-VISIT(G,u):递归访问u结点的未被访问的邻接点,然后回溯。
(2)伪代码:
DFS-VISIT(G,u):
time=time+1;
u.b=time; //第一次访问,开始时间戳
u.color=GRAY;
for v in G:Adj[u]
if v.color=WHITE //未被访问
v.f=u;
DFS-VISIT(G,S)//递归
End if
End for
u.color=BLACK;
time=time+1
u.e=time; //回溯,第二次访问,结束时间戳
End
(注:color 属性标记是否访问,f属性深度优先森林,b和e属性括号化结构)
二、 分析比较
1. 图表示方法比较:
1. 对于稀疏图,采用邻接链表存储节省空间,链式存储结构,可以结点之间的关系申请链表空间的大小,但是结点的访问速度慢。
2. 对于稠密图,采用邻接矩阵存储,稠密图中边比较多采用矩阵存储(二维数组),访问速度比较快O(1)。
2. 图搜索算法的比较:
1. 广度优先搜索采用队列存储结点;结点的color属性用于标记该结点是否被访问以及邻近结点的状态;d属性用于记录从根结点到该结点的最短距离(含有理论推导证明);f属性用于指向该结点的前驱结点,生产广度优先树。
2. 深度优先搜索采用函数栈存储,递归搜索;结点的color属性用于标记该结点是否被访问以及被访问的次数;f属性用于指向该结点的前驱结点,生成深度优先森林;b属性记录第一次被访问的时间戳,e属性记录第二次被访问的时间戳。
3. 相关定理:
1. 广度优先搜索的正确性:设是一个有向或者无向图,BFS以为源结点在图上运行,那么BFS从源点可以到达所有的结点,在算法终止时:
I.对所有的,有;
II.从源结点到结点的其中一条最短路径为从结点s到结点的最短路径+边;
2. 广度优先树;
3. 括号化定理:主要原因是基于递归的函数栈;