算法 | DFS和BFS

本文介绍了深度优先搜索(DFS)和广度优先搜索(BFS)两种图算法,包括它们的伪代码实现和应用。DFS用于判断有向图和无向图中是否存在环,BFS则用于寻找图的最短路径和计算图的直径。这两种算法分别利用栈和队列进行节点的访问,并通过颜色标记和时间戳来跟踪已访问和未访问的节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、DFS

深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.(百度百科)

通常,可以用栈stack结构来存储。

1. DFS搜索的伪代码如下:

DFS(G)
{
   for each vertex u
   {
      u.color = WHITE;
   }
   time = 0;//时间戳
   for each vertex u
   {
      if (u.color == WHITE)
         DFS_Visit(u);
   }
}
DFS_Visit(u)
{
   u.color = gray;
   time = time+1;
   u. d = time;//将时间戳加1并保存在d中
   for each v in u.Adj[]
   {
   	//遍历当前顶点的所有邻居顶点
      if (v.color = = WHITE)
         DFS_Visit(v);
   }
   u.color = black;
   time = time+1;
   u.f = time;
   //时间戳d和f记录了每个顶点第一次被访问和最后一次被访问的时间。
}

2. DFS的应用:判断有向图中是否存在环

DFS(G){
	for each vertex u{
		u.color = WHITE;
		u.parent = NULL;
	}
	for each vertex u{
		if (u.color == WHITE)
		if (DFS_Visit(u) == true)
			return true;//存在环
	}
	return false;//不存在环
}

DFS_Visit(u){
	u.color = GRAY;
	for each v in u.Adj[]{
		if (v.color == WHITE){
			v.parent = u;
			if (DFS_Visit(v) == true) return true;
		}
		else if (v.color == GRAY) return true;
	}
	u.color = BLACK;
	return false;
}

3. DFS的应用:判断无向图中是否存在环

DFS(G)
{
	for each vertex u
	{
		u.color = WHITE;
		u.parent = NULL;//无向图中要加入对父子节点的判别
	}
	for each vertex u
	{
		if (u.color == WHITE)
		if (DFS_Visit(u) == true)
		return true;//存在环
	}
	return false;//不存在环
}

DFS_Visit(u)
{
	u.color = GRAY;
	for each v in u.Adj[]
	{
		if (v.color == WHITE)
		{
			v.parent = u;
			if (DFS_Visit(v) == true)	return true;
		}
		else if (v.color == GRAY && v != u.parent) 
				return true;
	}
	u.color = BLACK;
	return false;
}

二、 BFS

广度优先搜索(BFS)算法,是一种基于队列的搜索算法,用于遍历或搜索图形或树的数据结构。它从指定的源节点开始,遍历其相邻节点,然后逐层遍历其它未访问的相邻节点,直到所有节点都被访问。

通常,可以用队列queue结构来存储。

1. BFS搜索的伪代码如下:

BFS(G,s){//图G,源节点s
	initialize vertices;//初始化:u.color=WHITE,time=0;
	Q={s};
	while(Q not empty){
	u=RemoveTop(Q);//队头元素
	for each v in u.adj[]{
		if(v.color==WHITE)
			v.color=GRAY;
			v.d=u.d+1;
			v.p=u;
			Enqueue(Q,v);//入队
	}
	u.color=BLACK;
	}
}

2. BFS的应用:最短路径算法(加权图)

BFS(G, s){
	for each vertex v {
		if v != s {
			path = [v];
			while (v.p != s) {
				path.append(v.p);
				v = v.p;
			}
			path.append(s);
			path.reverse();
			print(path);
		}
	}
}

3. BFS的应用:最短路径算法(非加权图)

ShortestPath(G, s) {
	initialize vertices;
	Q = {s};
	while (Q not empty) {
		u = RemoveTop(Q);
		for each v  u.adj[] {
			if (v.color == WHITE) {
				v.color = GREY;
				v.d = u.d + 1;
				v.p = u;
			Enqueue(Q, v);
			}
		}
		u.color = BLACK;
	}
	for each vertex v {
		if v != s {
			path = [v];
			while (v.p != s) {
				path.append(v.p);
				v = v.p;
			}
			path.append(s);
			path.reverse();
			print(path);
		}
	}
}

4. BFS应用:图的直径

图的直径是指图中所有节点对之间最短路径的最大值。直径是图的一个重要性质,它可以用于评估图的大小和复杂度。

GraphDiameter(G) {
	initialize vertices;
	maxDiameter = 0;
	for each vertex s {
		BFS(G, s);
		for each vertex v {
			if v.d > maxDiameter {
				maxDiameter = v.d;
			}
		}
	}
	return maxDiameter;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值