`
阅读更多

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();
    	}
    }

}

 

1
1
分享到:
评论

相关推荐

    图的邻接矩阵实现及深度优先搜索(JAVA)

    对于无向图,矩阵是对称的,因为边i到j和j到i是等价的。对于有向图,矩阵可能不对称。 在Java中,我们可以创建一个二维整数数组来表示邻接矩阵。例如,对于一个包含n个节点的图,我们可以定义一个n×n的数组。下面...

    图的遍历(有向图和无向图)

    本主题将详细介绍有向图和无向图的深度优先遍历(DFS)与宽度优先遍历(BFS),并探讨递归和非递归两种实现方式。 首先,我们来理解有向图和无向图的区别。有向图的边具有方向性,即从一个节点指向另一个节点,而无...

    Graph-DFS_WFS.zip_java无向图_wfs遍历_深度优先遍历

    本文将详细讲解"Graph-DFS_WFS.zip"压缩包中涉及的知识点,包括Java实现的无向图、深度优先遍历(DFS)以及宽度优先遍历(WFS)。 首先,我们来理解什么是无向图。无向图是一种图结构,其中的边没有方向性,即任意...

    深度优先搜索与有向无环图的拓扑排序(java实现)

    深度优先搜索(Depth First Search, DFS)是一种在图或树数据结构中遍历或搜索的算法。它从根节点开始,沿着某一条路径一直探索到叶子节点,然后回溯到下一个未访问的节点,继续进行探索,直到所有节点都被访问。在...

    图的邻接矩阵实现及广度优先搜索(JAVA)

    下面是一个简单的无向图的邻接矩阵表示: ```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在解决许多算法问题中发挥着重要...

    java深度优先遍历

    深度优先遍历(Depth First Search,DFS)是图论与数据结构中的一种经典搜索算法,主要应用于树或图的遍历。在Java中,我们可以利用递归或栈数据结构来实现这一算法。DFS的主要思想是从根节点开始,沿着某一条路径...

    java 深度优先遍历、广度优先遍历、最短路径、最小生成树

    最后,**最小生成树算法**用于找到一个加权无向图的边集,这些边连接了所有节点,并且使得总的边权重最小。Kruskal算法是基于并查集的数据结构,按边的权重从小到大依次考虑,只要不形成环路就添加到结果集中。Prim...

    数据结构无向图

    数据结构中的无向图是一种重要的抽象数据类型,它表示了顶点之间的相互连接关系,而这些连接没有方向性。在无向图中,如果存在一条边连接顶点A和顶点B,那么同样可以说存在一条边连接顶点B和顶点A。这种图的边不具有...

    Java版查找并打印有向图中的所有环路径

    在有向图中查找环路的方法通常有深度优先搜索(DFS)和拓扑排序。深度优先搜索是一种递归策略,通过遍历图的分支直到达到终点或发现环路。当发现环路时,可以立即返回,从而避免无谓的遍历。另一方面,拓扑排序是将...

    图的几种常用算法(广度/深度优先搜索,最小生成树,弗洛伊德,拓扑排序....)java实现,简单易懂。

    MST是在加权无向图中找到一棵包括所有节点且总权重最小的树。有多种算法可以求解MST,如Prim算法和Kruskal算法。在Java中,Prim算法通常使用优先队列(PriorityQueue)来选择最小边,而Kruskal算法则依赖于并查集...

    Java实现深度优先、广度优先的网页爬虫

    深度优先搜索是一种用于遍历或搜索树或图的算法。它沿着树的深度遍历树的节点,尽可能深地搜索子树。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达...

    求一个无向图的最大环的边数(POJ3895) (java解答)

    标题中的“求一个无向图的最大环的边...综上所述,解决这个问题涉及到图论的基础知识,包括图的存储结构、深度优先搜索算法,以及Java编程技术。通过对图的遍历和状态跟踪,我们可以找到并计算无向图中最大的环的边数。

    深度优先搜索学习五例之一(JAVA)

    1. **图的遍历**:DFS可以用于遍历无向图或有向图,通过访问每个顶点来确保所有连接都被检查。例如,manriver.java文件可能包含了对一个图的DFS遍历,其中可能使用了递归或栈来实现。 2. **连通性检测**:DFS可以...

    基于java数据结构实验基于邻接矩阵和邻接表的深度广度优先遍历图.pdf

    此外,实验还包括无向图的广度优先搜索遍历过程,即首先访问出发点V,接着访问V的所有邻接点W1、W2、⋯、Wt,然后再依次访问与W1、W2、⋯、Wt邻接的所有未访问过的顶点,直到图中所有与初始出发点Vi有路径相通的顶点...

    数据结构图的邻接矩阵,邻接表存储表示,图的深度优先搜索遍历,广度优先搜索遍历

    在压缩包文件"数据结构图的邻接矩阵,邻接表存储表示,图的深度优先搜索遍历,广度优先搜索遍历_1602077415"中,包含了关于这些主题的详细资料,可能包括理论解释、代码示例和练习题,帮助读者深入理解和掌握图的存储...

    DFS.rar_dfs_dfs java_图的遍历_无向图 java

    深度优先搜索(Depth First Search, DFS)是一种在图或树数据结构中进行遍历或搜索的算法。在本文中,我们将深入探讨DFS的概念、实现方式以及如何在Java中应用于无向图。 首先,DFS的基本思想是从起始节点出发,...

    深度优先搜索学习五例之五(JAVA)

    深度优先搜索(DFS, Depth-First Search)是一种用于遍历或搜索树或图的算法,它按照“深入”的策略访问图或树中的节点。在Java中实现DFS,通常使用递归或者栈数据结构来完成。这篇博文“深度优先搜索学习五例之五...

    广度优先搜索学习五例之二(JAVA)

    通常,这样的教程会包括代码实现、步骤解析以及为什么选择BFS而不是深度优先搜索(Depth-First Search, DFS)的原因。 【标签】:“源码”、“工具” “源码”标签表明文章会包含实际的Java代码示例,读者可以参考...

Global site tag (gtag.js) - Google Analytics