思想:
一条路走到底,走到被访问过的结点,退回一个节点,遍历未访问的结点,重复此项工作。(遍历次序可能不同)
案例:根的先根遍历
代码(邻接矩阵)(连通图)
void DFS(AMGraph G,int v)//v起始顶点
{
int Visited[AMGraph.vexnum];//辅助数组:记录节点有没有被访问过
memset(Visited,0,sizeof(Visited));//0代表未访问过
cout<<v ; Visited[v]=1;
for(int w=0;w<G.vexnum;w++)
{
if(G.arcnum[v][w]!=0&&(!Visited[w]))
DFS(G,w);
//w是v的邻接点,如果w未访问,则递归调用DFS
}
}
对于非连通图:遍历完一个连通分量后,再遍历另一个连通分量
广度优先搜索(BFS)
思想:
先访问完一个节点的所有邻接点,然后按照邻接点的被访问顺序,重复此过程,直到所有节点都被访问。
类似于:树的层次遍历
代码
void BFS(ALGraph G,int v)//非递归
{
int visited[G.vexnum];//用作该节点有没有被访问过
memset(visited,0,sizeof(visited));
cout<<v;visited[v]=1;
initQueue(Q);//初始化队列Q
EnQueue(Q,v);//v进队
while(!QueueEmpty(Q))//队列非空
{
DeQueue(Q,u);//队头元素出队并置为u
for(int w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w))
{
if(!visited[w])
{
cout<<w;visited[w]=1;
EnQueue(Q,w);//w进队
}
}
}
}
邻接矩阵时间复杂度:O(n²)
邻接表时间复杂度O(m+e)
空间复杂度O(n)