原理:
DFS是从每一个顶点开始的深度优先遍历,结果都是对该分支路径深入遍历到不能再深入为止,且每个顶点只能被访问一次。
具体实现是:
从图G中某个顶点v出发,先访问该结点,然后依次沿着未访问过的v的邻接顶点进行深度优先遍历,直到图G中和顶点v之间有相连路径的其他顶点都被访问过为止;此时,如果图G中还有其他顶点未被访问过,则从这些顶点中任选一个作为起始顶点,重复上述过程,直到图G中所有顶点都被访问过为止。
//数组visited代表顶点访问情况,访问过的为1,未访问的为0
int visited[N];
void DFS(Graph G, int v)
{
visited[v] = 1;
//Visit()代表对顶点的访问
Visit(v);
//函数FirstAdjvex(G,v)返回图G中v的第一个邻接点,NextAdjvex(G,v,w)返回v的(相对于w)的下一个邻接点
//若w是v的最后一个邻接点,则返回空;
for (w = FirstAdjvex(G, v);w >= 0;w = NextAdjvex(G, v, w))
{
if (!visited(w))
{
DFS(G, w);
}
}
}
void DFSSearch(Graph G)
{
int i;
for (i = 0;i < G.vexnum;++i)
visited[i] = 0;
for (i = 0;i < G.vexnum;++i)
{
//对未访问过的结点调用DFS
if (!visited[i])
{
DFS(G, i);
}
}
}