`
128kj
  • 浏览: 600424 次
  • 来自: ...
社区版块
存档分类
最新评论

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

    博客分类:
阅读更多

遍历,直到图中所有顶点都被访问到为止。
import java.util.Stack;
// 图的邻接矩阵实现及深度优先搜索图dfs.java
//顶点类
class Vertex
   {
   public char label;        
   public boolean wasVisited;//此顶点是否被访问过

   public Vertex(char lab)   // constructor
      {
      label = lab;
      wasVisited = false;
      }

   } 

//图的邻接矩阵实现
class Graph
   {
   private final int MAX_VERTS = 20;
   private Vertex vertexList[]; // 存放顶点的数组
   private int adjMat[][];      // 邻接矩阵
   private int nVerts;          // 当前的顶点数
   private Stack<Integer>  theStack;

   public Graph()             
      {
      vertexList = new Vertex[MAX_VERTS];
                                         
      adjMat = new int[MAX_VERTS][MAX_VERTS];
      nVerts = 0;
      for(int y=0; y<MAX_VERTS; y++)      
         for(int x=0; x<MAX_VERTS; x++)   
            adjMat[x][y] = 0;
      theStack = new Stack<Integer>();
      }  

   public void addVertex(char lab)//在图中添加一个顶点
      {
      vertexList[nVerts++] = new Vertex(lab);
      }

  //在图中增加一条边
   public void addEdge(int start, int end)
      {
      adjMat[start][end] = 1;
      adjMat[end][start] = 1;
      }

    //显示顶点v
   public void displayVertex(int v)
      {
      System.out.print(vertexList[v].label);
      }

   //深度优先遍历图
   public void dfs()  // depth-first search
      {       // 从顶点 vertexList[0]开始搜索
      vertexList[0].wasVisited = true;  //标记已访问过
      displayVertex(0);                 
      theStack.push(0);                 // 进栈

      while( !theStack.isEmpty() )      
         {
         // 查看栈顶元素,看其是否有未访问过的邻接点
         int v = getAdjUnvisitedVertex( theStack.peek() );
         if(v == -1)                    // 没有
            theStack.pop();             //出栈
         else                           //有
            {
            vertexList[v].wasVisited = true;  // 访问v
            displayVertex(v);                
            theStack.push(v);                 // 进栈
            }
         }  

     
      for(int j=0; j<nVerts; j++)  //为了继续使用DFS,重置所有顶点的标志
         vertexList[j].wasVisited = false;
      }  

  //从邻接矩阵中判断顶点v是否有未访问过的邻接点
   public int getAdjUnvisitedVertex(int v)
      {
      for(int j=0; j<nVerts; j++)
         if(adjMat[v][j]==1 && vertexList[j].wasVisited==false)
            return j;
      return -1;
      }  
}

public class DFSApp
   {
   public static void main(String[] args)
      {
      Graph theGraph = new Graph();
      theGraph.addVertex('A');    // 0  (start for dfs)
      theGraph.addVertex('B');    // 1
      theGraph.addVertex('C');    // 2
      theGraph.addVertex('D');    // 3
      theGraph.addVertex('E');    // 4

      theGraph.addEdge(0, 1);     // AB
      theGraph.addEdge(1, 2);     // BC
      theGraph.addEdge(0, 3);     // AD
      theGraph.addEdge(3, 4);     // DE

      System.out.print("Visits: ");
      theGraph.dfs();            
      System.out.println();
      }  
   }

下载源码:
  • 大小: 27.2 KB
分享到:
评论

相关推荐

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

    本文将深入探讨如何使用Java实现图的邻接矩阵以及如何在该数据结构上执行广度优先搜索(BFS)。 **邻接矩阵** 邻接矩阵是一种二维数组,它用来表示图中顶点之间的连接。如果图是无向的,邻接矩阵是对称的;如果图...

    邻接矩阵实现图的广搜和深搜(java模板)

    本文将深入探讨如何使用邻接矩阵来实现图的广度优先搜索(BFS)和深度优先搜索(DFS),并提供一个Java模板。 首先,我们需要理解邻接矩阵的概念。邻接矩阵是一个二维数组,其中的元素表示图中节点之间的连接。如果...

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

    实验的目的包括掌握图的相关概念、掌握用邻接矩阵和邻接表的方法描述图的存储结构、掌握图的深度优先搜索和广度优先搜索遍历的方法及其计算机的实现。 实验的内容包括使用邻接矩阵、邻接表作为图的存储结构建立一个...

    图的邻接表存储及遍历(JAVA)

    相比于邻接矩阵,邻接表在处理稀疏图(边的数量远小于顶点数量的平方)时更节省空间。邻接表的主要优点是它可以根据边的连接关系动态地添加和删除,且遍历效率较高。 二、邻接表的实现 在Java中,我们可以使用...

    数据结构邻接矩阵 Graph

    - **图的遍历**:深度优先搜索(DFS)和广度优先搜索(BFS)是常见的图遍历算法,它们可以基于邻接矩阵实现。 - **图的应用**:图被广泛应用于网络路由、社交网络、推荐系统、生物信息学等领域。 通过研究"数据...

    邻接矩阵和邻接表存储的图的遍历

    本主题将深入探讨两种常见的图存储方式——邻接矩阵和邻接表,以及如何在这两种存储方式下实现深度优先遍历(DFS)和广度优先遍历(BFS)。 首先,邻接矩阵是一种直观的图表示方法,它使用二维数组来存储图中每个...

    java使用邻接表对图进行深度和广度优先遍历

    在这个Java程序中,我们将探讨如何使用邻接表来实现图的深度优先遍历(DFS)和广度优先遍历(BFS)。邻接表是图数据结构的一种有效实现方式,尤其对于稀疏图(边的数量远小于节点数量的平方)来说,它比邻接矩阵更加...

    有向图的邻接矩阵.。。

    4. **遍历**:邻接矩阵便于进行深度优先搜索(DFS)和广度优先搜索(BFS)。DFS可以从矩阵中沿着非零元素向下搜索,BFS可以通过队列来逐层访问矩阵的行或列。 5. **操作效率**:虽然邻接矩阵方便查询任意两个节点之间...

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

    本主题将深入探讨图的两种常见存储方式——邻接矩阵和邻接表,以及如何进行深度优先搜索(DFS)和广度优先搜索(BFS)遍历。 **邻接矩阵**是一种直观且简单的图存储方法。对于一个有n个顶点的图,邻接矩阵是一个n×...

    图的邻接矩阵表示实验

    1)实现图的邻接矩阵和邻接表存储结构; 2)完成基于邻接矩阵的深度优先搜索遍历及广度优先搜索遍历; 3)实现从键盘输入任意一对顶点,求出顶点间的最短路径。

    数据结构 图(邻接矩阵) java图形界面 实现

    6. **GraphGui.java**:这是项目中的主要源代码文件,很可能包含了图的类定义,邻接矩阵的实现,以及GUI组件的布局和事件监听。文件可能包括以下功能: - 初始化图和邻接矩阵 - 添加和删除顶点 - 显示和更新GUI以...

    邻接矩阵存储图的深度优先遍历

    邻接矩阵是一种常用的图存储方式,其本质是一个二维数组。对于有 � n 个节点的无向图,我们可以用一个 � × � n×n 的二维矩阵 � G 来表示它,其中 � � , � G i,j ​ 表示节点 � i 与节点 � j 之间...

    图数据结构以及深度优先和广度优先算法java实现

    在Java中,我们可以使用邻接矩阵或邻接表来实现图数据结构。 **邻接矩阵** 是一种二维数组,其中的元素表示对应顶点之间是否存在边。如果图是无向的,矩阵是对称的;如果是有向的,则可能不对称。对于稀疏图(边的...

    Java语言描述存储结构与邻接矩阵代码示例

    本文主要探讨了在Java中如何使用存储结构来表示图,并特别关注了邻接矩阵这一概念,以及其Java代码实现。 首先,存储结构是图数据结构的基础。在处理图时,我们需要存储节点(顶点)及其相互连接的方式,即边。对于...

    Java实现深度优先搜索算法(DFS)

    在上述示例代码中,我们同样使用邻接矩阵表示图。graph是一个二维数组,其中graph[i][j]表示顶点i和j之间是否存在边。 深度优先搜索使用递归来实现。我们从指定的起始顶点开始,并将其标记为已访问。然后,对于起始...

    数据结构 作业 图的遍历

    在提供的压缩包文件中,你可能会找到用不同编程语言(如C++、Java、Python等)实现的DFS和BFS算法,它们可能包含了递归和非递归版本,以及如何表示图(邻接矩阵或邻接表)。通过理解并运行这些代码,你可以更好地...

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

    本资源包含了一些图算法的Java实现,包括但不限于广度优先搜索(BFS)、深度优先搜索(DFS)、最小生成树(Minimum Spanning Tree, MST)、弗洛伊德算法(Floyd-Warshall)以及拓扑排序。下面将详细介绍这些算法及其...

    数据结构-图的应用(邻接矩阵、邻接多重表)

    对任意给定的图(顶点数不小于20,边数不少于30,图的类型可以是有向图、无向图、有向网、无向网),能够输入图的顶点和边(或弧)的信息,并存储到相应存储结构(邻接矩阵、邻接表、十字链表、邻接多重表,任选其中...

Global site tag (gtag.js) - Google Analytics