图的遍历(深度优先搜索)

1、深度优先搜索遍历过程

图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。

  • 基本思想:
    假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

深度优先搜索是一个递归的过程

深度优先遍历特点是,选定一个出发点后进行遍历,能前进则前进,若不能前进,回退一步再前进,或再回退一步后继续前进。依此重复,直到所有与选定点相通的所有顶点都被遍历。

2、示例

在这里插入图片描述
对图7-25连通无向图采用深度优先搜索遍历可得到顶点访问序列:v0,v1,v3,v7,v4,v8,v2,v5,v6

对图7-26连通无向图采用深度优先搜索遍历可得到顶点访问序列:v0,v1,v3,v2,v4,v5,v6,v7

3、连通图的深度优先搜索遍历算法

  • 基本思想:
    给定一图G=<V,E>,用visited[i]表示顶点i的访问情况,初值设为0,表示所有顶点未被访问过,当顶点被访问过时置1。则初始情况下所有的visited[i]都为0。假设从顶点V0开始遍历,则下一个遍历的顶点是V0的第一个邻接点Vi,接着遍历Vi的第一个邻接点Vj,……直到所有的顶点都被访过。
  • 算法描述(用邻接矩阵实现)
    递归实现
#include<stdio.h>
#define MaxSize 10
typedef char VertexType;//节点类型 

int visited[MaxSize] = {0};//标识该节点是否被访问 


/*—————————图的构造———————————*/
typedef struct {
	int edgeNum;//边数 
	int vertexNum;//节点个数 
	VertexType vertex[MaxSize];//存放点的一维数组 
	int edge[MaxSize][MaxSize]; //存放边的二维数组 
}MGraph; 

void init(MGraph *G);
void DFS(MGraph *G, int v);

/*—————————深度优先遍历——————————*/
void DFS(MGraph *G, int v){
	printf("%c", G -> vertex[v]);
	visited[v] = 1;
	for(int i = 0; i < G -> vertexNum; i++)
		if(G -> edge[v][i] == 1 && visited[i] == 0)
			DFS(G,i);
} 

void init(MGraph *G){
	int i, j, k, R, C;
	printf("输入顶点数和边数\n");
	scanf("%d %d", & G -> vertexNum, &G -> edgeNum);
	printf("输入顶点信息\n");
	for(i = 0; i < G -> vertexNum; i++)
		scanf(" %c", & G ->vertex[i]);//输入点的信息前面加个空格 
		
		
	//对存储边的信息数组进行初始化 
	for(i = 0; i < G -> vertexNum; i++)
		for(j = 0; j < G ->vertexNum; j++)
			G -> edge[i][j] = 0;
			
	printf("输入边(vi, vj)的上标i,下标j\n");
	for(k = 0; k < G -> edgeNum; k++){
//		printf("-----------\n") ;
		scanf("%d %d", &R, &C);
		G->edge[R][C] = 1;
		G->edge[C][R] = 1;
	}	
}

int main(){
	MGraph MG;
	init(&MG);
	DFS(&MG, 0); 
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值