Java如何实现的图的遍历
发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章主要介绍Java如何实现的图的遍历,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.图的遍历从图中某一顶点出发访问图中其余顶点,且每个顶点仅被访问一次图的遍历有两种深度
千家信息网最后更新 2025年01月16日Java如何实现的图的遍历
这篇文章主要介绍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]; //辅助队列 Queuequeue = 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); }
以上是"Java如何实现的图的遍历"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
顶点
标记
广度
深度
思路
起点
数组
点数
结果
代码
内容
有向图
篇文章
路径
队列
图中
递归
辅助
相同
两个
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网页网络安全设置
网络技术 网络安全
网络安全2020主题
台湾属于那个服务器
服务器共享文件管理
应用软件开发有哪些
科技产品互联网公司
Excel 数据库 随机
网络安全的保障措施 l
我国网络安全法第47条
我的世界网易版32k 服务器
数据库怎么恢复挂起
数据库模型按照什么来划分的
网络安全法网络运营者之
苹果wi-fi服务器怎么设置
网络安全系统分为几级
戴尔t440服务器h330
预付软件开发款怎么处理
嵌入式和纯软件开发
软件开发的专业问题面试综评
产品质量追溯软件开发
怎样打开二卡上的数据库
邮件服务器预算
文件服务器文件历史版本
宁夏手机软件开发语言
南昌棋牌软件开发
网络安全监管机构 网信办
山东有哪些软件开发公司
vba 局域网共用数据库
计算机原理和网络技术