深度优先搜索--以及图的基本操作

本文介绍了图的基本概念,如邻接、路径和连通图,并详细讲解了邻接矩阵和邻接表两种表示方法。接着,重点阐述了如何在图中添加顶点和边,以及深度优先搜索(DFS)的工作原理,包括其规则和Java代码实现。最后,给出了创建图对象、添加顶点和边以及执行DFS的示例代码。
摘要由CSDN通过智能技术生成

临接:如果两个顶点被同一条边连接,就称这个顶点是临接的。
路径:路径是边的序列
连通图:如果至少有一条路径可以连接起所有的顶点,那么称这个图是连通的。
邻接矩阵:邻接矩阵是一个二维数组,数组项表示两点之间是否存在遍。如果有N个顶点,邻接矩阵就是N*N的数组。这里写图片描述

邻接表:
邻接表是一个链表数组(或者链表的链表)。每个单独的链表表示邻有哪些顶点与当前顶点邻接。
这里写图片描述
在图中添加顶点和边:
为了向图中添加顶点,必须用new生成一个新的顶点对象,然后插入到顶点数组vertexList中,在模拟真实世界的程序中,顶点可能包含许多的数据项,但是为了简便起见,假定顶点只包含单一的字符,因此顶点的创建可以使用下面的代码:
vertexList[nVerts++] = new Vertex(‘F’)
nVerts是当前的顶点数。


假定使用邻接矩阵并考虑在顶点1和顶点3之间加一条边,这些数字对应vertexList的下标,顶点存储在数组的对应位置。首次创建邻接矩阵adjMat时,初值为0,添加边的代码如下:
adiMat[1][3] = 1;
adjMat[3][1] = 1;


Graph类,它包含了创建了邻接矩阵和邻接表的方法,以向Graph对象插入顶点和边的方法。

class Graph
{

 private  final  int  MAX_VERTS = 20;
 private  Vertex  vertexList[]  ;
 private  int  adjMat[][];
 private  int  nVerts;  

 //.......................
 public  Graph()
 {
     vertexList  = new  Vertex[MAX_VERTS];

     adjMat = new  int[MAX_VERTS][MAX_VERTS];
     nVerts = 0;
     for (int i = 0; i < MAX_VERTS; i++)
    for (int j = 0; j < MAX_VERTS; j++)
    adjMat[i][j] = 0;
 }
 //.....................................
 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;
 }

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

}

——————————————————————————————
搜索:有两种常用的方法可以用来搜索图:即深度优先搜索(DFS Depth-First Search)和广度优先搜索(BFS Breadth-First Search).它们最后都会到达所有连通的顶点。深度优先搜索通过栈来实现,而广度优先搜索通过队列来实现。
————————————————————————
深度优先搜索:
为了实现深度优先搜索,找一个起始点–本例为A点,需要做三件事:首先访问该顶点然后将其放入栈中,以便记住它,最后标记该点,这样就不会再访问它。
这里写图片描述

规则1:如果可能,访问一个邻接的未访问节点,标记它,并将其放入栈中。
规则2:当不能执行规则1时,如果栈不为空,就从栈中弹出一个顶点。
规则3:如果不能执行规则1和规则2,就完成了整个搜索过程。

从A开始,访问A,标记A,并将A放入栈中;下面访问B,标记B,将B放入栈中;同理,访问F,H…..
将H放入栈后,应用规则2,从栈中弹出H,这样又回到了顶点F。F叶没有与之相邻且未访问的顶点了,那么再弹出F,这时回到顶点B,此时只有顶点A在栈中。
然而A还有未访问的邻接点,所以访问的下一个节点是C,但是C又是这条路线的终点,所以从栈中弹出它,再次回到A点。接着访问D,G和I。当到达I时,把它们都弹出栈。现在回到A,然后访问E,最后再次回到A。
然而这次A也没有未访问的邻节点,所以把它也弹出栈,现在栈中已经没有顶点,应用规则3.


深度优先搜索的栈内容:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值