Java 由浅入深带你掌握图的遍历

作者:〖雪月清〗 时间:2022-05-21 07:21:44 

1.图的遍历

从图中某一顶点出发访问图中其余顶点,且每个顶点仅被访问一次

图的遍历有两种深度优先遍历DFS、广度优先遍历BFS

2.深度优先遍历

深度优先遍历以深度为优先进行遍历,简单来说就是每次走到底。类似于二叉树的前序遍历

思路:

1.以某一个顶点为起点进行深度优先遍历,并标记该顶点已访问

2.以该顶点为起点选取任意一条路径一直遍历到底,并标记访问过的顶点

3.第2步遍历到底后回退到上一个顶点,重复第2步

4.遍历所有顶点结束

根据遍历思路可知,这是一个递归的过程,其实DFS与回溯基本相同。

遍历:

Java 由浅入深带你掌握图的遍历

以此图为例进行深度优先遍历


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.遍历所有顶点结束

通过队列来辅助遍历,队列出队顺序即是广度优先遍历结果

Java 由浅入深带你掌握图的遍历

遍历

Java 由浅入深带你掌握图的遍历

以此图为例,采用邻接矩阵的方式创建图,进行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

标签:Java,图的遍历
0
投稿

猜你喜欢

  • Java实现输出数字三角形实例代码

    2023-08-25 02:09:51
  • JavaWeb项目部署到服务器详细步骤详解

    2023-11-29 11:15:20
  • java+jsp+struts2实现发送邮件功能

    2023-08-28 18:25:27
  • Java中Druid连接池连接超时获取不到连接的解决

    2022-09-15 04:49:59
  • Java DecimalFormat 保留小数位及四舍五入的陷阱介绍

    2023-11-09 04:49:33
  • java之路径分隔符介绍

    2022-12-14 22:35:23
  • java Semaphore共享锁实现原理解析

    2021-11-02 23:12:38
  • SpringMVC执行过程详细讲解

    2023-06-07 10:04:54
  • java HttpClient传输json格式的参数实例讲解

    2023-08-08 13:21:26
  • java线程池对象ThreadPoolExecutor的深入讲解

    2023-05-15 06:49:51
  • Spring Security 控制授权的方法

    2023-08-06 19:21:08
  • Flutter瀑布流仿写原生的复用机制详解

    2023-06-20 17:02:08
  • Java编程中的4种代码块详解

    2022-01-04 03:10:20
  • Java StringBuffer与StringBuilder有什么区别

    2022-12-15 22:35:12
  • 详解Spring Cloud Eureka多网卡配置总结

    2023-11-09 07:33:15
  • Java泛型机制与反射原理相关知识总结

    2023-11-11 06:02:15
  • 带你详细了解Java值传递和引用传递

    2023-02-19 08:42:26
  • java中的this引用及对象构造初始化

    2023-03-07 09:38:17
  • 解决ThingsBoard编译报错问题:Failure to find org.gradle:gradle-tooling-api:jar:6.3

    2021-11-20 16:24:22
  • Spring boot配置绑定和配置属性校验的方式详解

    2022-04-21 03:06:06
  • asp之家 软件编程 m.aspxhome.com