深度优先搜索(dfs、深搜)java实现-数据结构和算法
上一篇:广度优先搜索算法(bfs、广搜)java实现-数据结构和算法
用邻接矩阵表示图的定点之间的关系
如下图数据结构
则用邻接矩阵表示为:
private static int map[][]={
{0 ,3 ,6 ,-1 ,-1 ,-1 ,-1 ,-1,-1,-1,-1},
{3 ,0 ,-1 ,4 ,1 ,-1 ,-1 ,-1,3 ,-1,-1},
{6 ,-1 ,0 ,-1 ,-1 ,-1 ,-1 ,3 ,-1,-1,-1},
{-1 ,4 ,-1 ,0 ,3 ,-1 ,-1 ,6 ,-1,-1,-1},
{-1 ,1 ,-1 ,3 ,0 ,5 ,-1 ,-1,-1,-1,-1},
{-1 ,-1 ,-1 ,-1 ,5 ,0 ,2 ,-1,-1, 3, 3},
{-1 ,-1 ,-1 ,-1 ,-1 ,2 ,0 ,1 ,-1,-1,-1},
{-1 ,-1 ,3 ,6 ,-1 ,-1 ,1 ,0 ,-1,-1,-1},
{-1 ,3 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1,0 ,-1,-1},
{-1 ,-1 ,-1 ,-1 ,-1 ,3 ,-1 ,-1,-1,0 ,3 },
{-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1,-1,3 ,0 }
};
横坐标和纵坐标代表第n个节点,值>0代表两个节点相连,并且值代表两个节点之间的权值(暂时没有用到),-1代表两个节点之间不相连。
算法和思路:
- 1.从第一个节点开始当作当前节点
- 2.遍历当前节的所有没有被标记的子节点
- 3.如果有[没有被标记的子节点,则把当前节点入栈,把子节点赋值给当前节点,继续过程2。否则,判断栈中是否含有元素,如果含有,则取出一个元素继续过程2,否则结束遍历
java代码实现:
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;
public class Test {
/**
* 邻接矩阵表示的图 的二维数组
* 横坐标和纵坐标代表第n个节点,值>0代表两个节点相连,并且值代表两个节点之间的权值(暂时没有用到),
* -1代表两个节点之间不相连
*/
private static int map[][]={
{0 ,3 ,6 ,-1 ,-1 ,-1 ,-1 ,-1,-1,-1,-1},
{3 ,0 ,-1 ,4 ,1 ,-1 ,-1 ,-1,3 ,-1,-1},
{6 ,-1 ,0 ,-1 ,-1 ,-1 ,-1 ,3 ,-1,-1,-1},
{-1 ,4 ,-1 ,0 ,3 ,-1 ,-1 ,6 ,-1,-1,-1},
{-1 ,1 ,-1 ,3 ,0 ,5 ,-1 ,-1,-1,-1,-1},
{-1 ,-1 ,-1 ,-1 ,5 ,0 ,2 ,-1,-1, 3, 3},
{-1 ,-1 ,-1 ,-1 ,-1 ,2 ,0 ,1 ,-1,-1,-1},
{-1 ,-1 ,3 ,6 ,-1 ,-1 ,1 ,0 ,-1,-1,-1},
{-1 ,3 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1,0 ,-1,-1},
{-1 ,-1 ,-1 ,-1 ,-1 ,3 ,-1 ,-1,-1,0 ,3 },
{-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1,-1,3 ,0 }
};
public static void main(String[] args) {
dfs();
}
/**
* 深度优先搜索
* 思路:
* 1.从第一个节点开始当作当前节点
* 2.遍历当前节的所有没有被标记的子节点
* 3.如果有[没有被标记的子节点,则把当前节点入栈,把子节点赋值给当前节点,继续过程2。
* 否则,判断栈中是否含有元素,如果含有,则取出一个元素继续过程2,否则结束遍历
*/
public static void dfs() {
Set<Integer> set=new HashSet<Integer>();
/**
* 存储经过的节点路径
*/
LinkedList<Integer> path=new LinkedList<Integer>();
/**
* 储存待遍历节点的栈
*/
LinkedList<Node> stack=new LinkedList<Node>();
Node th=new Node(0, 0);//当前需要遍历的节点
map[th.i][th.p]=-1;
while(true) {
int p;
for(p=th.p;p<map.length;p++) {
/**
* 遍历当前节点的所有没有遍历过的子节点
*/
if(map[th.i][p]>0&&map[p][p]==0) {
th.p=p+1;
stack.addFirst(th);//当前节点入栈
if(!set.contains(th.i)) {
set.add(th.i);
path.addFirst(th.i);
}
th=new Node(p,0);
map[p][p]=-1;
p=0;
}
}
if(!set.contains(th.i)) {
set.add(th.i);
path.addFirst(th.i);
}
if(stack.size()>0) {
th=stack.removeFirst();
}else {
break;
}
}
while(path.size()>0){
System.out.print(path.removeLast()+"\t");
}
}
public static class Node{
public Integer i;//当前元素i
public Integer p;//当前遍历第p个元素
public Node(int i,int p) {
this.i=i;
this.p=p;
}
}
}
输出:
0 1 3 4 5 6 7 2 9 10 8
评论区
请写下您的评论...
猜你喜欢
数据结构与算法
2808
广度优先搜索算法(dfs、深搜)java实现-数据结构和算法用邻接矩阵表示图的定点之间的关系如下图的数据结构:则用邻接矩阵表示为: privatestaticintmap[][]={ {0,3,6
blog
算法-迷宫问题-广度优先搜索-队列
数据结构与算法
9223
问题描述思路:典型的广度优先搜索算法,根据字典序大小,可以确定遍历的循序,因为字典序DLRU,所以对于每一个节点优先先往下走,然后向左走,然后向右走,然后向上走。则最后首先到达出口的一条路径就是符合
weblog
6654
a*搜索算法动态演示分析请参考http://photo.jiajiajia.club/item/a-star.html什么是a*搜索算法A*搜寻算法,俗称A星算法,作为启发式搜索算法中的一种,这是一
blog
迷宫问题-寻找最短路径
数据结构与算法
9453
迷宫问题-寻找最短路径算法:广度优先搜索数据结构:队列,链表代码实现:!DOCTYPEhtmlhtml head metacharset="UTF-8" title/title script
weblog
6940
://photo.jiajiajia.club/item/a-star.htmlDijkstra算法与最佳优先搜索在了解a*算法之前相信您已经对这两个算法有所了解Dijkstra算法是典型最短路径算法,用于计算一个节点到其他节点
blog
程序员必须掌握的数据结构和算法
数据结构与算法
2170
原文链接:https://www.zhihu.com/question/23148377?sort=created算法基础 时间复杂度 空间复杂度基础数据结构 线性表 列表(必学) 链表(必学
weblog
6156
什么是二叉树的前驱节点和后继节点?某节点的前驱节点的val值小于该节点的val值并且值是最大的那个节点。某节点的后继节点的val值大于该节点的val值并且值是最小的那个节点。下面给出一个二叉树节点类
blog
java用数组实现优先级队列(小顶堆)
数据结构与算法
5599
,largestout)的行为特征。通常采用堆数据结构来实现。优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。操作:1.往队列中添加数据2.从队列中获取数据优先级队列通
最新发表
归档
2018-11
12
2018-12
33
2019-01
28
2019-02
28
2019-03
32
2019-04
27
2019-05
33
2019-06
6
2019-07
12
2019-08
12
2019-09
21
2019-10
8
2019-11
15
2019-12
25
2020-01
9
2020-02
5
2020-03
16
2020-04
4
2020-06
1
2020-07
7
2020-08
13
2020-09
9
2020-10
5
2020-12
3
2021-01
1
2021-02
5
2021-03
7
2021-04
4
2021-05
4
2021-06
1
2021-07
7
2021-08
2
2021-09
8
2021-10
9
2021-11
16
2021-12
14
2022-01
7
2022-05
1
2022-08
3
2022-09
2
2022-10
2
2022-12
5
2023-01
3
2023-02
1
2023-03
4
2023-04
2
2023-06
3
2023-07
4
2023-08
1
2023-10
1
2024-02
1
2024-03
1
2024-04
1
2024-08
1
标签
算法基础
linux
前端
c++
数据结构
框架
数据库
计算机基础
储备知识
java基础
ASM
其他
深入理解java虚拟机
nginx
git
消息中间件
搜索
maven
redis
docker
dubbo
vue
导入导出
软件使用
idea插件
协议
无聊的知识
jenkins
springboot
mqtt协议
keepalived
minio
mysql
ensp
网络基础
xxl-job
rabbitmq
haproxy
srs
音视频
webrtc
javascript
加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。