图的遍历 - 深度优先

109 阅读1分钟

深度优先思想

深度优先(depth first search): 一条道走到黑, 不撞南墙不回头

非连通有向图举例说明😁

image.png

首先-你得有一张图, 就像下面这样的👇

image.png

然后-你需要用合适的存储方式把图存到计算机里, 用来判断某个顶点是否存在邻接点

可以是邻接矩阵的方式👇

image.png

也可以是邻接表的方式👇

image.png

再然后-你需要一个标记数组来帮助你记录哪些点已经被访问了, 而哪些点还没有被访问, 类似这种的👇

image.png

最后-你需要一个, 来帮助你实现深度优先, 类似这个👇

image.png

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");
}