图的遍历:从一个已知顶点开始,搜索所有可到达的顶点。
两种常用方案:
(i) Breadth first search,BFS
(ii)depth first search, DFS .
一般采用深度优先算法 DFS,其效率更高。
(i) 图的广度优先搜索,BFS
类似与二叉树的层次遍历。用一个队列实现。
BFS示例代码:
virtual void bfs (int v, int reach[], int label)
{//BFS, reach[i] 用来标记从顶点i可以到达的所有顶点
arrayQueue<int> q(10);
reach[v] = label;
q.push(v);
while (!q.empty())
{
//从队列中删除一个标记过的顶点
int w =q.front;
q.pop();
//标记所有没有到达的临接于顶点w的顶点
vertexIterator<T> *iw = iterator(w);
int u;
while ((u = iw->next()) != 0)
{//访问顶点w的一个相邻顶点
if (reach[u] == 0)
{//u 是一个没有到达过的顶点
q.push(u);
reach[u] = label; //做到达标记
}
}
delete iw;
}
}
时间复杂度分析:
对于不同存储方式有不同的时间复杂度。
1.临接矩阵
O(n^2)
2.临接链表
O(n+e) = 找临接顶点开销是O(e) + 初始化各个顶点的label开销是O(n);
(ii)图的深度优先搜索, DFS
类似与二叉树的前序遍历。
递归写法非常地简单。
伪代码:
depthFirstSearch(v)
{
Label vertex v as reached.
for(each unreached vertex u adjacent from v)
depthFirstSearch(u);
}
时间复杂度与BFS类似
1.临接矩阵
O(n^2)
2.临接链表
O(n+e)