图的遍历方式:
图的遍历算法是图的连通性问题、拓扑排序、求关键路径等问题的基础。
1.深度优先搜索Depth First Search DFS
树的先根遍历的推广。
Boolean visted[MAX]; //使用访问标识数组
Status (*VisitFunc)(int v);
void DFSTraverse(Graph G,Status (*Visit)(int v)){
VisitFuc = Visit;
for(v = 0; v < G.vexnum; ++v) visited[v] = FALSE;
for(v = 0; v < G.vexnum; ++v)
if(!visited[v]) DFS(G,v);
}
//递归方法深度优先遍历图
void DFS(Graph G,int v){
visited[v] = TRUE;
VisitFunc(v);
for(w = FirstAdjVex(G,v);w;w =NexAdjVex(G,v,w))
if(!visited[w]) DFS(G,w);
}
遍历图的过程实际上查找邻接点的过程。时间复杂度取决于图的存储结构。
1.二维数组表示法:根据已有的结点查找邻接点,每次遍历数组此结点对应的那一行,
那么每一个结点相当于遍历二维数组的每一行,o(n*n)
2.邻接表表示法:n个结点和e个边或弧,o(n+e)
2.广度优先遍历 Breadth First Search BFS
类似于树的层次查找,由近及远,先访问距离短的顶点,且先访问的顶点的所有邻接点也优先访问。
类似于树的层级遍历,借用队列存储已经访问的的顶点。
void BFSTraverse(Graph G,Status (*Visit)(int v)){
for(v = 0; v < G.vexnum; v++) visited[v] = FALSE;
InitQueue(Q);
for(v = 0; v < G.vexnum; v++){
if(!visited[v]){
Visit(v); visied[v] = TRUE; EnQueue(Q,v);
}
while(!QueueEmpty()){
DeQueue(Q,v);
for(w = FirstAdjVex(G,v); w ; w = NextAdjVex(G,v,w)){
if(!visited[w]){
Visited(w); visited[w] = TRUE;
EnQueue(G,w);
}
}
}
}
}
广度优先搜索法与深度优先搜索法时间复杂度相同。