深度优先遍历(Depth First Search)
深度优先遍历类似于树的先序遍历
1.深度优先搜索遍历连通图
在无向图中任意两个顶点都是连通的(可以不是直接相连),则称该图为连通图 假设从顶点
V
1
V_1
V1?出发,访问序列为
V
1
→
V
2
→
V
3
→
V
4
→
V
3
(
已
访
问
)
→
V
5
V_1 \rightarrow V_2 \rightarrow V_3 \rightarrow V_4 \rightarrow V_3(已访问) \rightarrow V_5
V1?→V2?→V3?→V4?→V3?(已访问)→V5?
bool visited[MVNum];
void DFS(Graph G, int n){
cout << v;
visited[v]=true;
for(w=FirstAdjVex(G,v); w>=0; w=NextAdjVex(G,v,w))
if(!visited[w])
DFS(G,w);
}
2.深度优先搜索遍历非连通图
连通分量 下面两个图是上面非连通图的两个连通分量 每调用一次上面遍历连通图的算法,有多少次调用,就说明图中有多少个连通分量 (将非连通图分解为连通分量,分别进行遍历)
void DFSTraverse(Graph G){
for(v=0; v<G.vexnum; ++v)
visited[v]=false;
for(v=0; v<G.vexnum; ++v)
if(!visited[v])
DFS(G,v);
}
3.深度优先搜索遍历以结构为邻接矩阵的图
无向图 有向图 DFS只是对通道是否存在进行判断,对无向图和有向图算法上没有变化,完全通用
void DFS_AM(AMGraph G, int v){
cout << v;
visited[v]=true;
for(w=0; w<G.vexnum; w++)
if((G.arcs[v][w] != 0) && (!visited[w]))
DFS_AM(G,w);
}
4.深度优先搜索遍历以结构为邻接表的图
无向图 有向图
void DSL_AL(ALGraph G, int v){
cout << v;
visited[v]=true;
p=G.vertices[v].firstarc;
while(p != NULL){
w=p->adjvex;
if(!visited[w])
DSL_AL(G,w);
p=p->nextarc;
}
}
|