DFS深度优先搜索---最短路径问题全攻略,图文解析与算法实例,让你快速掌握DFS算法这一搜索利器!

DFS深度优先搜索原理:

深度优先搜索以"深度"作为第一关键词,每次都是沿着路径到不能再前进时才退回到最近的岔道口。

以一个有向图进行DFS
遍历来举例(从V0开始进行遍历,黑色表示结点未访问,白色表示结点已访问,虚线边表示当前遍历路径);

① 访问 V0,发现从V0出发可以到达两个未访问顶点∶ V1和 V2,因此准备访问 V1和 V2这两个顶点。此时情况如图所示:

②从V0出发访问V1,发现从V1出发可以到达两个未访问顶点:V3和V4,因此准备访问V3和V4这两个顶点。此时情况如图所示:


③从V1出发访问V3,但是V3出发不能到达任何未访问顶点,因此退回当前路径上距离V3最近的仍有未访问分支顶点的岔道口V1。此时情况如图所示:

退回V1
④从V1出发访问V4,发现从 V4出发可以到达一个未访问顶点∶V5,因此准备前往访问V5。此时情况如图所示:

从V4出发访问V5

⑤ 从V4出发访问V5,发现从 V5出发不能到达任何未访问顶点,因此退回到当前路径上距离V5最近的仍有未访问分支顶点的岔道口V0。此时情况如图所示:

退回V0

⑥ 从V0出发访问V2,发现从V2出发不能到达任何未访问顶点,因此退回到当前路径上距离V5最近的仍有未访问分支顶点的岔道口。但是此时路径上所有顶点的分支顶点都已被访问,因此 DFS 算法结束。此时情况如图所示:

DFS算法节点(所有分支节点都已被访问)

因此,DFS被形容为一条路走到黑,不撞南墙不回头。

沿着一条路径直到无法继续前进,才退回到路径上离当前顶点最近还存在未访问分支顶点的岔道口,并前往访问那些未访问分支顶点,直到遍历完整个图。

实战代码部分:

整体代码:

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>

int book[51][51];       //检索坐标
int a[51][51];          //通路与障碍坐标
int maze[51][51];       //路径二维坐标 
int n,m,p,q,min = 99999;//初始化最小值min 
int path1[51],path2[51];//保存路径的x,y坐标 
/*
int a[51][51] = {
                  {0,0,1,0,1,0,0},
                  {1,0,0,0,0,1,0},
                  {0,0,1,1,0,0,0},
                  {1,0,0,1,1,1,0},
                  {0,0,0,0,0,0,0},
                  {1,1,0,0,1,0,1},
                  {1,0,0,0,0,0,1},
                  
};*/

/*创建移动方向*/ 

int next[4][2] = {
   
                   {
   0,1},  //right
                   {
   1,0}, //up 
                   {
   0,-1}, //left
                   {
   -1,0} //down 
};

void dfs(int x ,int y,int step){
     //DFS深度优先 
	int tx,ty,k;                  //形参 
	
	if(x == q && y == p){
           //出口,找到目标,登出 
		
		if(step < min){
             //更新最短路径 
		min = step;
		
		for(int i = 0; i < step; i++)printf("(%d,%d)",path1[i],path2[i]);  //打印一维路径 
		
		for(int i = 0; i < n; i++){
        //清除maze缓存 
     	for(int j = 0; j < m; j++){
   
     		maze[i][j] = 0;
		 }
	 }
		
		for(int i = 0; i < step; i++){
     //由两个一维数组可构建一个二维数组 
           maze[path1[i]][path2[i]] = 5;  //赋值5代表路径 
		}
		
		printf("path = %d\n",min);     //打印最小值 
		
		printf("\n");

		}
		return ; //此时的return代表返回上一步 
		
	}
	
	for(k = 0; k <= 3; k++){
    //移动方向, 
		tx = x + next[k][0]; //当前x加即将移动方向 
		ty = y + next[k][1]; //当前y加即将移动方向 
		
		   if(tx < 1 || tx > n || ty < 1 || ty > m) //是否越界,越界跳出循环 
		   continue;
		   
		   if(a[tx][ty] == 0 && book[tx][ty] == 0){
    //a代表障碍,0表示无,book代表是否检索过,0代表未 
		   	book[tx][ty] = 1; //表示该坐标已检索 
		   	path1[step] = tx; //缓存x 
		   	path2[step] = ty; //缓存y 
		   	
		   	dfs(tx,ty,step+1);//进入下一步DFS 
		   	/*以下是回溯,这里代表return后的步骤,即回溯*/ 
		   	
		   	book[tx][ty] = 0
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是使用DFS算法来计算运输成本矩阵上的最短路径问题的Matlab代码。代码中假设运输成本矩阵为cost,起始点为start,终点为end,最多走五步。 ```matlab function [path, cost] = dfs_shortest_path(cost, start, end, max_steps) n = size(cost, 1); visited = zeros(n, 1); path = []; cost = inf; dfs(start, 0, [start], 1); function dfs(cur, cur_cost, cur_path, steps) if cur == end && cur_cost < cost path = cur_path; cost = cur_cost; return; end if steps > max_steps return; end visited(cur) = 1; for i = 1:n if cost(cur, i) ~= inf && ~visited(i) dfs(i, cur_cost+cost(cur, i), [cur_path i], steps+1); end end visited(cur) = 0; end end ``` 在代码中,首先定义了一个dfs_shortest_path函数,该函数接受四个参数:运输成本矩阵cost,起始点start,终点end,以及最多走的步数max_steps。函数中定义了一个visited数组,用于记录已经访问过的点,初始值为0。同时定义了path和cost变量,用于记录最短路径最短路径的成本,初始值为[]和inf。 接下来定义了一个内部函数dfs,该函数接受四个参数:当前点cur,当前路径成本cur_cost,当前路径cur_path,以及当前已经走的步数steps。如果当前点为终点,并且当前路径成本比之前记录的最短路径成本更小,则更新最短路径最短路径成本。如果已经走的步数超过了最大步数,则返回。否则,将当前点标记为已访问,遍历与当前点相邻的点,如果该点未访问过且与当前点有连边,则递归调用dfs函数。最后,将当前点的visited标记还原为未访问。 最后,dfs_shortest_path函数返回最短路径最短路径成本。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

livercy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值