Java实现图的深度优先遍历(DFS)

简介: Java实现图的深度优先遍历(DFS)

图深度优先遍历

编写程序对给定的 有向图(不一定连通) 进行深度优先遍历,图中包含n个顶点,编号为0至n-1。本题限定在深度优先遍历过程中,如果同时出现多个待访问的顶点,则优先选择编号最小的一个进行访问,以顶点0为遍历起点。

输入格式:

输入第一行为两个整数n和e,分别表示图的顶点数和边数,其中n不超过20000,e不超过50。接下来e行表示每条边的信息,每行为两个整数a、b,表示该边的端点编号,但各边并非按端点编号顺序排列。

输出格式:

输出为一行整数,每个整数后一个空格,即该有向图的深度优先遍历结点序列。

输入样例1:

3 3

0 1

1 2

0 2

输出样例1:

0 1 2

输入样例2:

4 4

0 2

0 1

1 2

3 0

输出样例2:

0 1 2 3

深度优先遍历的主要思想:

首先以一个未被访问过的顶点作为起始顶点,延当前顶点的边走到未访问过的顶点;当没有未访问过的顶点时,则返回上一个顶点,继续试探访问别的顶点,知道所有的顶点都被访问过。

显然,深度优先遍历时沿着图的某一条分支遍历直到末端,即“一条路走到黑”,然后再回溯,再沿着另一条进行同样的遍历,直到所有的顶点都被访问过为止

代码如下

importjava.util.Scanner;
publicclassMain {
staticScannerscan=newScanner(System.in);
//sum记录访问过多少个顶点staticintsum=0;
//n表示顶点的数量staticintn;
//e表示边的数量staticinte;
//输入顶点数和边数static {
n=scan.nextInt();
e=scan.nextInt();
    }
//book用来标记顶点已经访问过staticint[] book=newint[n];
//a用来存储图的邻接矩阵存储法staticint[][] a=newint[n][n];
publicstaticvoidmain(String[] args) {
//初始化二维矩阵,对角线为0,其他为无穷for (inti=0; i<n; i++) {
for (intj=0; j<n; j++) {
if (i==j)
a[i][j] =0;
elsea[i][j] =99;
            }
        }
//输入顶点之间的有向边for (inti=0; i<e; i++) {
intx=scan.nextInt();
inty=scan.nextInt();
a[x][y] =1;
        }
//图有可能不连通,因此深度优先遍历每个结点for (inti=0; i<n; i++) {
if (book[i] ==0) {
book[i] =1;
dfs(i);
            }
        }
    }
//cur是当前所在的顶点编号publicstaticvoiddfs(intcur) {
book[cur] =1;
//每访问一个结点,sum就加1sum++;
System.out.print(cur+" ");
//所有的顶点已经访问过就直接退出if (sum==n)
return;
//从第一个顶点依次尝试,查看哪些顶点与当前顶点cur有边相连for (inti=0; i<n; i++) {
//判断当前顶点cur到顶点i是否有边,并判断顶点i是否已经访问过if (a[cur][i] ==0&&book[i] ==0) {
//标记顶点已经访问过book[i] =1;
//从顶点i再出发继续遍历dfs(i);
            }
        }
return;
    }
}
目录
相关文章
|
3月前
|
存储 Java
Java学习笔记 List集合的定义、集合的遍历、迭代器的使用
Java学习笔记 List集合的定义、集合的遍历、迭代器的使用
|
13天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
24天前
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
18 3
|
1月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
19 1
|
1月前
|
存储 算法 Java
Java一分钟之-数组的创建与遍历
数组作为Java中存储和操作一组相同类型数据的基本结构,其创建和遍历是编程基础中的基础。通过不同的创建方式,可以根据实际需求灵活地初始化数组。而选择合适的遍历方法,则可以提高代码的可读性和效率。掌握这些基本技能,对于深入学习Java乃至其他编程语言的数据结构和算法都是至关重要的。
26 6
|
2月前
|
域名解析 分布式计算 网络协议
java遍历hdfs路径信息,报错EOFException
java遍历hdfs路径信息,报错EOFException
37 3
|
3月前
|
Java 容器
07 Java数组与数组操作(定义+遍历+排序+增删改查)(上)
07 Java数组与数组操作(定义+遍历+排序+增删改查)
50 8
|
3月前
|
存储 Java API
07 Java数组与数组操作(定义+遍历+排序+增删改查)(下)
07 Java数组与数组操作(定义+遍历+排序+增删改查)
41 4
|
4月前
|
算法 Java
java使用递归及迭代方式实现前序遍历 中序遍历 后序遍历 以及实现层序遍历
java使用递归及迭代方式实现前序遍历 中序遍历 后序遍历 以及实现层序遍历
86 7
|
3月前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
79 0