数据结构(C实现)------- 图的深度优先遍历

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020]

算法描述:      

       假设给定图G的初始状态是所有顶点均未曾访问过,在G中任选一顶点vi为初始的出发点,则深度优先遍历可定义如下: 首先访问出发点vi,并将其标记为已被访问过;然后,依次从vi出发遍历vi的每一个邻接点vj,若vj未曾访问过,则以vj为新的出发点继续进行深度优先遍历,直至图中所有和vi有路径相通的顶点都被访问到为止。因此,若G是连通图,则从初始出发点开始的遍历过程结束也就意味着完成了对图G的遍历。

算法实现:

       分别以邻接矩阵和邻接表作为图的存储结构,给出连通图的深度优先搜索遍历的递归算法。算法描述如下:

      (1) 访问出发点vi,并将其标记为已被访问已访问过。

      (2) 遍历vi的每一个邻接点vj,若vj未曾访问过,则以vj为新的出发点继续进行深度优先遍历。

完整代码:

      用邻接矩阵实现深度优先搜索算法源代码如下:

/**
 * 深度遍历图
 **/
void DFS_MG(MGraph MG,int i){
	visit[i] = 1;
	printf("%c\t",MG.vexs[i]);
	int j;
	for (j = 1; j <= MG.vexnum;j++){
		if(visit[j] == 0 && MG.arcs[i][j] == 1)
			DFS_MG(MG,j);
	}
}
    

     用邻接表实现深度优先搜索算法源代码如下:

/**
 * 深度遍历图
 **/
void DFS_AG(ALGraph AG,int i){
	ArcPtr p;
	printf("%c\t",AG.vertices[i].vexdata);
	visit[i] = 1;
	p = AG.vertices[i].firstarc;
	while( p!= NULL ){
		if(visit[p->adjvex] == 0)
			DFS_AG(AG,p->adjvex);
		p = p->nextarc;
	}
}


算法说明:

         对于具有n个顶点,e条边的连通图,算法DFS_MG,DFS_AG 均调用n次。除了初始调用是来自外部,基于n-1次调用均是来自DFS_MG和DFS_AG内部的递归调用,用邻接矩阵实现时,遍历一个顶点的所有邻接点需要O(n)时间,则遍历整个图需要O(n^2),即DFS_MG的时间复杂度为O(n^

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值