java版无向图的深度优先搜索和连通图的计算
这是本人学习相关算法后,自制的。欢迎大家前来指导学习,代码+详细注释奉上:
package ctong; import java.util.Arrays; import java.util.Random; public class Graph_DFS { /** * Ctong * @param args */ //建立一个标识数组,0表示未被发现的节点,1表示已被发现的节点,2表示邻接表检索完后的节点 private static int[] color; //记录连通图的个数 private static int count = 0; //遍历方法 public void DFS_visit(int[][] array,int n){ //节点n已查找 color[n]=1; System.out.println(Arrays.toString(color)); //从n出发查找与n相连的节点 for(int i = n;i<array.length;i++){ for(int j = 0;j<array.length;j++){ if(array[n][j]==1){ if(color[j]==0){ DFS_visit(array,j); } } } } color[n]=2; System.out.println(Arrays.toString(color)); //以上两次打印color数组是为了显示遍历过程,当某一次打印的数组只有2或0时,表示这里有一个已经查找完毕的连通图 } public Graph_DFS(int[][] graph){ //初始化color数组,表示该无向图的所有节点都没有查找过 for(int i = 0;i<graph.length;i++){ color[i]=0; } //图的遍历 for(int j = 0;j<graph.length;j++){ if(color[j]==0){ //每次执行以下2行代码,表示多出一个连通图 count++; DFS_visit(graph,j); } } } /** * 主函数 */ public static void main(String[] args) { //创建一个1,2,3和4,5,6的环 int[][] map1 = new int[][]{ {0,1,0}, {1,0,0}, {0,0,0}, }; int[][] map = new int[][]{ {0,1,0,0,0,0}, {1,0,0,0,0,0}, {0,0,0,1,0,0}, {0,0,1,0,0,0}, {0,0,0,0,0,1}, {0,0,0,0,1,0}}; //创建随机数组 int[][] map2 = createRandomBArray(); //打印 print(map2); System.out.println("随机创建的2维数组中,行号和列号表示2个节点,它们对应的数据表示它们的连接情况,0表示这两个节点未连通,1表示这两个节点连通"); //0表示未被发现的节点,1表示已被发现的节点,2表示邻接表检索完后的节点 color = new int[map2.length]; System.out.println("无向图的深度优先搜索:"); new Graph_DFS(map2); System.out.println("连通图个数为:"+count); } //创建一个随机的2维数组 private static int[][] createRandomBArray() { Random ra= new Random(); int n = ra.nextInt(5)+4; int[][] Barray= new int[n][n]; for(int k = 0;k<n;k++){ Barray[k][k]=0; } for(int i = 0 ;i<n;i++){ for(int j = 0 ;j<n;j++){ if(i!=j){ if(j>i){ if(Math.random()<0.5) Barray[i][j]= 1; else Barray[i][j]= 0; }else Barray[i][j]=Barray[j][i]; } } } return Barray; } //打印二维数组 public static void print(int[][] c){ for(int i=0;i<c.length;i++ ){ for(int j=0;j<c.length;j++ ){ if(c[i][j]==0) System.out.print(c[i][j]+"\t"); else System.out.print(c[i][j]+"\t"); } System.out.println(); } } }
相关推荐
对于无向图,矩阵是对称的,因为边i到j和j到i是等价的。对于有向图,矩阵可能不对称。 在Java中,我们可以创建一个二维整数数组来表示邻接矩阵。例如,对于一个包含n个节点的图,我们可以定义一个n×n的数组。下面...
本主题将详细介绍有向图和无向图的深度优先遍历(DFS)与宽度优先遍历(BFS),并探讨递归和非递归两种实现方式。 首先,我们来理解有向图和无向图的区别。有向图的边具有方向性,即从一个节点指向另一个节点,而无...
本文将详细讲解"Graph-DFS_WFS.zip"压缩包中涉及的知识点,包括Java实现的无向图、深度优先遍历(DFS)以及宽度优先遍历(WFS)。 首先,我们来理解什么是无向图。无向图是一种图结构,其中的边没有方向性,即任意...
深度优先搜索(Depth First Search, DFS)是一种在图或树数据结构中遍历或搜索的算法。它从根节点开始,沿着某一条路径一直探索到叶子节点,然后回溯到下一个未访问的节点,继续进行探索,直到所有节点都被访问。在...
下面是一个简单的无向图的邻接矩阵表示: ```java int[][] adjacencyMatrix = { {0, 1, 1, 0}, // 顶点0 {1, 0, 1, 1}, // 顶点1 {1, 1, 0, 1}, // 顶点2 {0, 1, 1, 0} // 顶点3 }; ``` **广度优先搜索(BFS)...
深度优先搜索(Depth-First Search, DFS)是一种用于遍历或搜索树或图的算法,它的基本思想是尽可能深地探索图的分支。在遇到死胡同时,算法会回溯到上一步,尝试其他可能的路径。DFS在解决许多算法问题中发挥着重要...
深度优先遍历(Depth First Search,DFS)是图论与数据结构中的一种经典搜索算法,主要应用于树或图的遍历。在Java中,我们可以利用递归或栈数据结构来实现这一算法。DFS的主要思想是从根节点开始,沿着某一条路径...
最后,**最小生成树算法**用于找到一个加权无向图的边集,这些边连接了所有节点,并且使得总的边权重最小。Kruskal算法是基于并查集的数据结构,按边的权重从小到大依次考虑,只要不形成环路就添加到结果集中。Prim...
数据结构中的无向图是一种重要的抽象数据类型,它表示了顶点之间的相互连接关系,而这些连接没有方向性。在无向图中,如果存在一条边连接顶点A和顶点B,那么同样可以说存在一条边连接顶点B和顶点A。这种图的边不具有...
在有向图中查找环路的方法通常有深度优先搜索(DFS)和拓扑排序。深度优先搜索是一种递归策略,通过遍历图的分支直到达到终点或发现环路。当发现环路时,可以立即返回,从而避免无谓的遍历。另一方面,拓扑排序是将...
MST是在加权无向图中找到一棵包括所有节点且总权重最小的树。有多种算法可以求解MST,如Prim算法和Kruskal算法。在Java中,Prim算法通常使用优先队列(PriorityQueue)来选择最小边,而Kruskal算法则依赖于并查集...
深度优先搜索是一种用于遍历或搜索树或图的算法。它沿着树的深度遍历树的节点,尽可能深地搜索子树。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达...
标题中的“求一个无向图的最大环的边...综上所述,解决这个问题涉及到图论的基础知识,包括图的存储结构、深度优先搜索算法,以及Java编程技术。通过对图的遍历和状态跟踪,我们可以找到并计算无向图中最大的环的边数。
1. **图的遍历**:DFS可以用于遍历无向图或有向图,通过访问每个顶点来确保所有连接都被检查。例如,manriver.java文件可能包含了对一个图的DFS遍历,其中可能使用了递归或栈来实现。 2. **连通性检测**:DFS可以...
此外,实验还包括无向图的广度优先搜索遍历过程,即首先访问出发点V,接着访问V的所有邻接点W1、W2、⋯、Wt,然后再依次访问与W1、W2、⋯、Wt邻接的所有未访问过的顶点,直到图中所有与初始出发点Vi有路径相通的顶点...
在压缩包文件"数据结构图的邻接矩阵,邻接表存储表示,图的深度优先搜索遍历,广度优先搜索遍历_1602077415"中,包含了关于这些主题的详细资料,可能包括理论解释、代码示例和练习题,帮助读者深入理解和掌握图的存储...
深度优先搜索(Depth First Search, DFS)是一种在图或树数据结构中进行遍历或搜索的算法。在本文中,我们将深入探讨DFS的概念、实现方式以及如何在Java中应用于无向图。 首先,DFS的基本思想是从起始节点出发,...
深度优先搜索(DFS, Depth-First Search)是一种用于遍历或搜索树或图的算法,它按照“深入”的策略访问图或树中的节点。在Java中实现DFS,通常使用递归或者栈数据结构来完成。这篇博文“深度优先搜索学习五例之五...
通常,这样的教程会包括代码实现、步骤解析以及为什么选择BFS而不是深度优先搜索(Depth-First Search, DFS)的原因。 【标签】:“源码”、“工具” “源码”标签表明文章会包含实际的Java代码示例,读者可以参考...