深度优先思想
深度优先(depth first search): 一条道走到黑, 不撞南墙不回头
非连通有向图举例说明😁
首先-你得有一张图, 就像下面这样的👇
然后-你需要用合适的存储方式把图存到计算机里, 用来判断某个顶点是否存在邻接点
可以是邻接矩阵的方式👇
也可以是邻接表的方式👇
再然后-你需要一个标记数组来帮助你记录哪些点已经被访问了, 而哪些点还没有被访问, 类似这种的👇
最后-你需要一个栈, 来帮助你实现深度优先, 类似这个👇
C语言代码实现(邻接矩阵)
void DFS_AMG(struct AMG_Graph *graph) // 这里传入的是邻接矩阵形式的图
{
int i, j;
int u;
int visited[MAX] = {0}; // 用来做标记的数组
for(i = 0; i < graph->vex_num; i++)
{
if(visited[i] == 0)
{
printf("%c ", graph->Vex[i]);
visited[i] = 1;
push(i);
while(!is_empty())
{
u = stack[top-1];
for(j = 0; j < graph->vex_num; j++)
{
if((graph->Edge[u][j] == 1) && (visited[j] == 0))
{
printf("%c ", graph->Vex[j]); // 访问
visited[j] = 1; // 标记
push(j); // 入栈
break;
}
}
if(j == graph->vex_num)
pop(); // 出栈
}
}
}
printf("\n");
}