Java 由浅入深带你掌握图的遍历
作者:〖雪月清〗 发布时间:2022-05-21 07:21:44
标签:Java,图的遍历
1.图的遍历
从图中某一顶点出发访问图中其余顶点,且每个顶点仅被访问一次
图的遍历有两种深度优先遍历DFS、广度优先遍历BFS
2.深度优先遍历
深度优先遍历以深度为优先进行遍历,简单来说就是每次走到底。类似于二叉树的前序遍历
思路:
1.以某一个顶点为起点进行深度优先遍历,并标记该顶点已访问
2.以该顶点为起点选取任意一条路径一直遍历到底,并标记访问过的顶点
3.第2步遍历到底后回退到上一个顶点,重复第2步
4.遍历所有顶点结束
根据遍历思路可知,这是一个递归的过程,其实DFS与回溯基本相同。
遍历:
以此图为例进行深度优先遍历
static void dfs(int[][] graph,int idx,boolean[]visit) {
int len = graph.length;
//访问过
if(visit[idx]) return;
//访问该顶点
System.out.println("V"+idx);
//标志顶点
visit[idx] = true;
for(int i = 1;i < len;i++) {
//访问该顶点相连的所有边
if(graph[idx][i] == 1) {
//递归进行dfs遍历
dfs(graph, i, visit);
}
}
}
遍历结果:
V1
V2
V3
V4
V5
V6
V7
V8
V9
创建图的代码:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//顶点数 以1开始
int n = scanner.nextInt();
int[][] graph = new int[n+1][n+1];
//边数
int m = scanner.nextInt();
for(int i = 1;i <= m;i++) {
int v1 = scanner.nextInt();
int v2 = scanner.nextInt();
graph[v1][v2] = 1;
graph[v2][v1] = 1;
}
//标记数组 false表示未访问过
boolean[] visit = new boolean[n+1];
dfs(graph, 1, visit);
}
3.利用DFS判断有向图是否存在环
思路:遍历某一个顶点时,如果除了上一个顶点之外,还存在其他相连顶点被访问过,则必然存在环
//默认无环
static boolean flag = false;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//顶点数 以1开始
int n = scanner.nextInt();
int[][] graph = new int[n+1][n+1];
//边数
int m = scanner.nextInt();
for(int i = 1;i <= m;i++) {
int v1 = scanner.nextInt();
int v2 = scanner.nextInt();
graph[v1][v2] = 1;
}
//标记数组 true为访问过
boolean[] visit = new boolean[n+1];
dfs(graph, 1, visit,1);
if(flag)
System.out.println("有环");
}
static void dfs(int[][] graph,int idx,boolean[]visit,int parent) {
int len = graph.length;
System.out.println("V"+idx);
//标记顶点
visit[idx] = true;
for(int i = 1;i < len;i++) {
//访问该顶点相连的所有边
if(graph[idx][i] == 1) {
if( !visit[i] ) {
dfs(graph, i, visit,idx);
}
else if(idx != i) {
flag = true;
}
}
}
}
注意:是有向图判断是否存在环,无向图判断是否存在环无意义,因为任意两个存在路径的顶点都可以是环
4.广度优先遍历
广度优先遍历是以广度(宽度)为优先进行遍历。类似于二叉树的层序遍历
思路:
1.以某一个顶点为起点进行广度优先遍历,并标记该顶点已访问
2.访问所有与该顶点相连且未被访问过的顶点,并标记访问过的顶点
3.以第2步访问所得顶点为起点重复1、2步骤
4.遍历所有顶点结束
通过队列来辅助遍历,队列出队顺序即是广度优先遍历结果
遍历
以此图为例,采用邻接矩阵的方式创建图,进行BFS遍历
static void bfs(int[][] graph) {
int len = graph.length;
//标记数组 false表示未访问过
boolean[] visit = new boolean[len];
//辅助队列
Queue<Integer> queue = new LinkedList<>();
queue.offer(1);
visit[1] = true;
while(!queue.isEmpty()) {
int num = queue.poll();
System.out.println("V"+num);
//遍历该顶点所有相连顶点
for(int i = 1;i < len;i++) {
//相连并且没有被访问过
if(graph[num][i] == 1 && !visit[i]) {
queue.offer(i);
visit[i] = true;
}
}
}
}
遍历结果:
V1
V2
V6
V3
V7
V9
V5
V4
V8
创建图的代码
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//顶点数 以1开始
int n = scanner.nextInt();
int[][] graph = new int[n+1][n+1];
//边数
int m = scanner.nextInt();
for(int i = 1;i <= m;i++) {
int v1 = scanner.nextInt();
int v2 = scanner.nextInt();
graph[v1][v2] = 1;
graph[v2][v1] = 1;
}
bfs(graph);
}
来源:https://blog.csdn.net/qq_52595134/article/details/123108852


猜你喜欢
- 最近在调试程序,想把过程中需要查看的数据输出到文件中,因此将简单的小方法分享一下1.首先需要声明一个文件指针变量FILE* fp;2.接下来
- 本文实例讲述了android动态布局之动态加入TextView和ListView的方法。分享给大家供大家参考。具体实现方法如下:packag
- ExpandableListView介绍 ExpandableListView的引入 ExpandableListVie
- 1.Object类的equals()方法:比较两个对象是否是同一个对象,equals() 方法比较两个对象,是判断两个对象引用指向的是同一个
- Activator.CreateInstance和AssemblyCreateInstance性能测试using System;using
- C# 的析构以及垃圾回收实例分析看书时,自己写的例子代码,了解到几个知识点,记载下来。同时发现自己手写代码的能力比较弱,还是得多写一下。us
- MyBatisMyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC
- 1. 前言我在Spring Security 实战干货:内置 Filter 全解析对Spring Security的内置过滤器进行了罗列,但
- collection标签的oftype属性能否为java.util.Map基于mybatis-3.4.5.jar版本,结论是可以的。<
- VAR 是3.5新出的一个定义变量的类型其实也就是弱化类型的定义VAR可代替任何类型编译器会根据上下文来判断你到底是想用什么类型的至于什么情
- mybatis-spring:@MapperScan注解在demo: springboot+mybatis的示例中,dao层接口使用了注解@
- 本文实例讲述了Java访问WebService返回XML数据的方法。分享给大家供大家参考。具体如下:import java.io.IOExc
- 一、背景项目中肯定会遇到异步调用其他方法的场景,比如有个计算过程,需要计算很多个指标的值,但是每个指标计算的效率快慢不同,如果采用同步执行的
- 在Android中实现菜单功能有多种方法。 Options Menu:用户按下menu Button时显示的菜单。 Context Menu
- struct InputStream 是单个输入流的管理器。是由 add_input_stream() 函数申
- 在linux主机部署Eureka高可用方案的时候,发现注册到服务中心的服务IP是随机的,由于主机的网卡是多个,随机的IP并不是自己想要的,上
- 本文实例讲述了c#分页读取GB文本文件的方法。分享给大家供大家参考。具体如下:一、应用场景:① .我在做BI开发测试的时候,有可能面对sou
- Feign其他功能-超时设置Feign 底层依赖于 Ribbon 实现负载均衡和远程调用。Ribbon默认1秒超时。超时配置:ribbon:
- 大家在使用 Intellij IDEA 的时候会经常遇到各种乱码问题,甚是烦扰。栈长也偶尔会用下IDEA,也有一些解决乱码的经验,我给大家总
- 本文根据一个简单的user表为例,展示 springboot集成mybatis,再到前端分页完整代码(新手自学,不足之处欢迎纠正);先看ja