搜索算法有很多种,本次文章主要分享图(无向图)的深度优先算法。深度优先算法(DFS)主要是应用于搜索中,早期是在爬虫中使用。其主要的思想有如下:

1.先访问一个节点v,然后标记为已被访问过
2.找到第一个节点的邻接节点w
3.如果第一个邻接节点w存在就走第4步,如果不存在就返回第一个节点v,从v的其他节点继续开始
4.如果节点w存在就怕判断该节点是否被访问过,如果没有被访问过就进行升读优先遍历(重复1,2,3)
5.查找节点v的邻接节点w的邻接节点(继续执行3)

先创建一个图,主要使用邻接矩阵(二位数组)进行存储节点到节点之间的关系。如果A可以到达B那么用1表示,不可以就用0进行表示。

而二维数组的长度是节点的个数,列如有n个节点那么二位数组的长度为Array[n][n]。

创建图以及深度优先算法的代码如下:

  1 public class Graph {
2
3 //创建一个集合用来存放顶点
4 private ArrayList<String> arrayList;
5 //创建一个二位数组来作为邻接矩阵
6 private int[][] TwoArray;
7 //边的数目
8 private int numOfEdges;
9 //使用一个数组记录节点是否被访问过
10 private boolean[] isVisted;
11 public static void main(String[] args) {
12 Graph graph = new Graph(5);
13 //测试
14 String[] ver={"A","B","C","D","E"};
15 //将节点放到集合中
16 for (String s : ver) {
17 graph.InsertVex(s);
18 }
19 //设置边
20 //A-B A-C B-C B-D B-E
21 graph.InsertEdeges(0,1,1);
22 graph.InsertEdeges(0,2,1);
23 graph.InsertEdeges(1,2,1);
24 graph.InsertEdeges(1,3,1);
25 graph.InsertEdeges(1,4,1);
26 //显示
27 graph.Show();
28 graph.DFS();
29 }
30
31 //初始化数据
32 public Graph(int n){
33 arrayList=new ArrayList<>(n);
34 TwoArray=new int[n][n];
35 numOfEdges=0;
36 isVisted=new boolean[n];
37 }
38
39 /**
40 * 根据节点的下标返回第一个邻接节点的下标
41 * @param index 节点的下标
42 * @return
43 */
44 public int getFirstVex(int index){
45 for (int i = 0; i < arrayList.size(); i++) {
46 if(TwoArray[index][i]!=0){
47 return i;
48 }
49 }
50 return -1;
51 }
52
53 /**
54 * 根据前一个节点下标获取下一个节点的下标
55 * @param v1 找到的第一个节点的
56 * @param v2 找到的第一个邻接节点并且被访问过的
57 * @return
58 */
59 public int getNextVex(int v1,int v2){
60 for (int i = v2+1; i < numEdges(); i++) {
61 if(TwoArray[v1][i]!=0){
62 return i;
63 }
64 }
65 return -1;
66 }
67
68 /**
69 * 深度优先算法的实现
70 * @param isVisted
71 * @param i
72 */
73 public void DFS(boolean[] isVisted,int i){
74 //先访问该节点
75 System.out.print(getValue(i)+"->");
76 //将节点设置为已经访问
77 isVisted[i]=true;
78 //查找该节点的第一个邻接节点
79 int firstVex = getFirstVex(i);
80 //不等于-1说明是存在的
81 while (firstVex!=-1) {
82 //如果存在且没有被访问过就进行访问
83 if (!isVisted[firstVex]) {
84 DFS(isVisted, firstVex);
85 }
86 firstVex = getNextVex(i, firstVex);
87 }
88 }
89
90 public void DFS(){
91 for (int i = 0; i <arrayList.size(); i++) {
92 if(!isVisted[i]){
93 //进行回溯
94 DFS(isVisted,i);
95 }
96 }
97 }
98 /**
99 * 添加节点
100 * @param vex
101 */
102 public void InsertVex(String vex){
103 arrayList.add(vex);
104 }
105
106 /**
107 * 设置边
108 * @param v1 第一个节点对应的下标
109 * @param v2 第二节点对应的下标
110 * @param weight 两个节点对应的权值
111 */
112 public void InsertEdeges(int v1,int v2,int weight){
113 TwoArray[v1][v2]=weight;
114 TwoArray[v2][v1]=weight;
115 numOfEdges++;
116 }
117
118 /**
119 * 返回节点对应的个数
120 * @return
121 */
122 public int numVex(){
123 return arrayList.size();
124 }
125
126 /**
127 * 返回边的总个数
128 * @return
129 */
130 public int numEdges(){
131 return numOfEdges;
132 }
133
134 /**
135 * 显示邻接矩阵(图的展示)
136 */
137 public void Show(){
138 for (int[] ints : TwoArray) {
139 System.out.println(Arrays.toString(ints));
140 }
141 }
142
143 /**
144 * 根据下标获取对应的数据
145 * @param i 下标
146 * @return
147 */
148 public String getValue(int i){
149 return arrayList.get(i);
150 }
151
152 public int getWeight(int v1,int v2){
153 int weight=TwoArray[v1][v2];
154 return weight;
155 }
156 }

代码执行结果如下:

图的深度优先遍历算法(DFS)的更多相关文章

  1. 图的深度优先遍历(DFS)和广度优先遍历(BFS)

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  2. 图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)

    参考网址:图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS) - 51CTO.COM 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath ...

  3. 图的深度优先遍历DFS

    图的深度优先遍历是树的前序遍历的应用,其实就是一个递归的过程,我们人为的规定一种条件,或者说一种继续遍历下去的判断条件,只要满足我们定义的这种条件,我们就遍历下去,当然,走过的节点必须记录下来,当条件 ...

  4. 图的深度优先遍历(DFS) c++ 非递归实现

    深搜算法对于程序员来讲是必会的基础,不仅要会,更要熟练.ACM竞赛中,深搜也牢牢占据着很重要的一部分.本文用显式栈(非递归)实现了图的深度优先遍历,希望大家可以相互学习. 栈实现的基本思路是将一个节点 ...

  5. 图的深度优先遍历(DFS)—递归算法

    实验环境:win10, DEV C++5.11 实验要求: 实现图的深度优先遍历 实验代码: #include <iostream> #define maxSize 255 #includ ...

  6. 数据结构——图的深度优先遍历(邻接矩阵表示+java版本)

    ​1.深度优先遍历(DFS) 图的深度优先遍历本质上是一棵树的前序遍历(即先遍历自身,然后遍历其左子树,再遍历右子树),总之图的深度优先遍历是一个递归的过程. 如下图所示,左图是一个图,右图是图的深度 ...

  7. PTA 邻接矩阵存储图的深度优先遍历

    6-1 邻接矩阵存储图的深度优先遍历(20 分) 试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)( ...

  8. 图论 - 图的深度优先遍历c++实现

    图的深度优先遍历c++实现 深度优先搜索 邻接矩阵的创建 int i, j, m, a, b; cin >> n >> m; //初始化二维矩阵 for (i = 1; i & ...

  9. 图的广度优先遍历算法(BFS)

    在上一篇文章我们用java演示了图的数据结构以及图涉及到的深度优先遍历算法,本篇文章将继续演示图的广度优先遍历算法.广度优先遍历算法主要是采用了分层的思想进行数据搜索.其中也需要使用另外一种数据结构队 ...

随机推荐

  1. vue uni-app项目中的tabbar

    由于公司要求开发百度小程序,所以我们采用uni-app开发的方式,一套代码多个小程序都可以用,在开发小程序的时候我们也经常会使用到tabbar.当然自己写出来也是不错的.这个就来介绍uni-app中的 ...

  2. String--常见面试题

    String s = new String("xyz") 创建了几个对象? 实例分析1 javac编译代码,然后用javap来反编译,执行javap -c Test 从结果来看,l ...

  3. 我的程序员之路:自学Java篇

    序章 时光疾驰,从事IT行业已两年有余. 16年11月开始自学Java,从此开启自学之路,后来实习期自学大数据.python.爬虫等,最终成长为一名平凡的程序员.回首望去,一路上的过往历历在目,有初学 ...

  4. 【MySQL 高级】知识拓展

    MySQL高级 知识拓展 MySQL高级 知识拓展 数据量 和 B+树 的关系 事务隔离级别集底层原理MVCC 唯一索引和普通索引的关键不同点 MRR:multi range read 练习和总结

  5. 基于 MPI 的快速排序算法的实现

    完整代码: #include <iostream> #include <cstdlib> #include <ctime> #include <algorit ...

  6. Mysql数据类型以及特性,,,防止SQL注入

    MyISAM.InnoDB.HEAP.BOB,ARCHIVE,CSV等 MyISAM:成熟.稳定.易于管理,快速读取.一些功能不支持(事务等),表级锁. InnoDB:支持事务.外键等特性.数据行锁定 ...

  7. 【Linux】用find删除大于30天的文件

    1.删除文件命令: find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \; 实例命令:find /opt/soft/log/ -mt ...

  8. DB2版本升级(V9.7升级到V11.1)

    1.V11.1版本升级路线 DB2 11.1 可以将现有的 Db2 V9.7.Db2 V10.1 或 Db2 V10.5 实例和数据库直接升级到 Db2 V11.1.如果 Db2 服务器正在 Db2 ...

  9. ABAP中SQL语句,指定索引(oracle)

    ①常用的两种方法: 1.指定使用全表扫描:%_HINTS ORACLE 'FULL(table_name)' 表示扫描整个表 2.指定索引:%_HINTS ORACLE 'INDEX("ta ...

  10. 2V转3V的电源芯片电路图,2.4V转3V电路

    两节镍氢电池1.2V+1.2V是2.4V的标称电压,2.4V可以转3V输出电路应用. 在2.4V转3V和2V转3V的应用中,输出电流可最大600MA. 2V的低压输入,可以采用PW5100低压输入专用 ...