《大话数据结构》笔记系列7--图

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27022241/article/details/80322266

                       《大话数据结构》笔记系列7--图

3 图的遍历

    从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历(Travesing Graph)。

3.1 深度优先遍历

    深度优先遍历(Depth First Search),也称为深度优先搜索,简称为DFS。

    它从图中某个顶点V出发,访问此顶点,然后从V的未被访问的邻接点出发深度优先遍历图,直至图中所有和V有路径相通的顶点都被访问到。我们这里讲的是连通图,对于非连通图,只需对它的连通分量分别进行深度优先遍历,即在先前一个顶点进行一次深度优先遍历后,若图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

    使用邻接矩阵方式,代码如下:

typedef int Boolean;         //Boolean是布尔类型,其值是TRUE或FALSE
Boolean visited[MAX];        //访问标志的数组
//邻接矩阵的深度优先遍历算法
void DFS(MGraph G, int i)
{
	int j;
	visited[i] = TRUE;
	printf("%c", G.vex[i]);         //打印顶点,也可以进行其它操作
	for (j = 0; j < G.numVertexes; j++)
	{
		if (G.arc[i][i] == 1 && !visited[j])
		{
			DFS(G, j);                         //对未访问的邻接顶点递归调用
		}
	}
}

//邻接矩阵的深度优先遍历操作
void DFSTraverse(MGraph G)
{
	int i;
	for (i = 0; i < G.numVertexes; i++)
		visited[i] = FALSE;                  //初始所有顶点状态都是未访问状态
	for (i = 0; i < G.numVertexes; i++)
	{
		if (!visited[i])                     //对未访问过的顶点调用DFS,若是连通图,只会执行一次
			DFS(G, i);
	}
}

    使用邻接表结构,代码如下:

typedef int Boolean;         //Boolean是布尔类型,其值是TRUE或FALSE
Boolean visited[MAX];        //访问标志的数组
//邻接表的深度优先遍历算法
void DFS(GraphAdjust GL, int i)
{
	EdgeNode *p;
	int j;
	visited[i] = TRUE;
	printf("%c", GL->adjList[i].data);         //打印顶点,也可以进行其它操作
	p = GL->adjList[i].firstedge;
	while (p)
	{
		if (!visited[p->adjvex])
			DFS(GL, p->adjvex);               //对未访问的邻接顶点递归调用
		p = p->next;
	}
}

//邻接表的深度优先遍历操作
void DFSTraverse(GraphAdjust GL)
{
	int i;
	for (i = 0; i < Gl->numVertexes; i++)
		visited[i] = FALSE;                  //初始所有顶点状态都是未访问状态
	for (i = 0; i < Gl->numVertexes; i++)
	{
		if (!visited[i])                     //对未访问过的顶点调用DFS,若是连通图,只会执行一次
			DFS(Gl, i);
	}
}

3.2 广度优先遍历

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页