
图(图)由顶点的有限非空集和顶点边组成。它通常表示为g(v,e),其中g表示图,v是图G中的顶点集,E是图G中的边集。
有向图
Directed edges: if we have directions from the vertices of Vi to Vj, we call this edge a directed edge and an arc (Arc). 我们用有序对表达VI称为弧尾,和Vj被称为弧头。
无序的图
无向边:如果顶点vi和Vj之间的边缘没有方向,它被称为无向边(边)是由一个无序的副代表(六世Vj)。
简单图
简单图:在一个图结构中,如果没有顶点到自己的边,且没有出现相同的边,就称为简单图。
地图
顶点
在创建一个图类创建一个顶点类保存顶点和边的第一步。作为链表相同的这类,对二叉搜索树的节点类。顶点类有两个数据成员:一个是用于确定顶点,和其他的表示一个布尔值访问过。它们的名字标签,分别来看。
复制代码代码如下所示:
函数顶点(标签){
this.label =标签;
}
我们保存数组中的所有顶点,在图类中,它们可以由数组中的位置引用。
表示边
图的实际信息保持在边缘上,因为它们描述了图的结构,两叉树的父节点只能有两个子节点,而图的结构更灵活。顶点可以有一个边或多个边连接到它。
我们将把图的边表示为邻接表或邻接表数组,它将存储顶点相邻顶点的数组。
建筑图
图类定义如下:
复制代码代码如下所示:
函数图(v){
this.vertices = V; / /顶点的最高点
this.edges = 0;
this.adj = { };
对于(var i = 0;i < this.vertices;+ +我){
这是形容词{ } };
这个。{ } }。推();
}
this.addedge = addedge;
this.tostring = toString;
}
这个类记录一个图所代表的边数,并用图的长度和顶点数记录顶点的个数。
复制代码代码如下所示:
功能addedge(){
这个。{ } }。推(w);
这是形容词;
这个边缘+ +;
}
在这里我们用for循环的数组来存储所有的相邻顶点的每个元素添加一个阵,并初始化为空字符串的所有元素。
图的遍历
DFS
深度优先遍历(depthfirstsearch),也被称为深度优先搜索,被称为DFS。
比如,在房间里找一把钥匙,无论从哪个房间可以开始,角落里的房间,床头柜,床,床,衣柜,电视柜,一个接一个找,不要让任何人死,当所有的抽屉,柜子都看了之后,找一个房间。
深度优先搜索:
深度优先搜索是访问未访问过的顶点,将其标记为访问,并递归地访问在初始顶点邻接列表中未访问的其他顶点。
为图形类添加一个数组:
复制代码代码如下所示:
this.marked = {}; / /保存访问过的顶点
对于(var i = 0;i < this.vertices;+ +我){
这一点。
}
深度优先搜索功能:
复制代码代码如下所示:
函数DFS(v){
这一点;
这里不需要if语句
如果(这个){ }!=未定义的){
打印(访问顶点V);
对于每一个(这个w中的var w){
如果(!标记为{ }){
this.dfs(W);
}
}
}
}
广度优先搜索
广度优先搜索(BFS)属于盲目搜索方法,其目的是扩大和检查系统以图形的所有节点找到结果。换句话说,它没有考虑到结果的可能位置和搜索整个地图直到彻底的结果。
广度优先搜索从第一个顶点开始,并试图尽可能接近顶点,如下图所示:
这项工作的原则是:
1。首先查找与当前顶点相邻的未访问的顶点,并将它们添加到访问顶点和队列列表中。
2。然后从图中取出下一个顶点v,并将其添加到已访问的顶点列表中。
三.最后,将所有与V相邻的非访问顶点添加到队列中。
以下是广度优先搜索函数的定义:
复制代码代码如下所示:
功能的BFS(s){
var队列{ };
this.marked =真;
Queue.push(S); / /添加到终点
当(队列长度> 0){
var = queue.shift(V); / /从第一组删除
如果(= =未定义){
打印(访问顶点V);
}
对于每一个(这个w中的var w){
如果(!标记为{ }){
这到{白} = V;
这一点;
Queue.push(W);
}
}
}
}
最短路径
当执行广度优先搜索时,会自动找到从一个顶点到另一个顶点的最短路径。
确定路径
为了找到最短路径,我们需要修改广度优先搜索算法来记录从一个顶点到另一个顶点的路径。我们需要一个数组来保存顶点的所有边以保存顶点。我们称这种阵列候选。
复制代码代码如下所示:
this.edgeto = {}; / /这一行添加到图形类
/ / BFS功能
功能的BFS(s){
var队列{ };
this.marked =真;
Queue.push(S); / /添加到终点
当(队列长度> 0){
var = queue.shift(V); / /从第一组删除
如果(= =未定义){
打印(访问顶点V);
}
对于每一个(这个w中的var w){
如果(!标记为{ }){
这到{白} = V;
这一点;
Queue.push(W);
}
}
}
}
拓扑排序算法
拓扑排序将对有向图的所有顶点进行排序,以将顶点从前顶点指向有向图的顶点。
拓扑排序算法是类似的。与拓扑不同,排序算法不输出当前的顶点,而是访问当前顶点邻接列表中的所有相邻顶点。在列表耗尽之前,当前顶点将被推入堆栈中。
拓扑排序算法分为两个函数。第一个功能是topsort(),这是用来设置排序过程和调用辅助功能topsorthelper(),然后显示有序顶点列表。
拓扑排序算法主要实现递归函数topsorthelper()。这个函数标记当前要访问的顶点,然后递归地访问当前顶点邻接表中的每个顶点,并标记这些顶点将被访问。最后,当前顶点被压缩到堆栈中。
复制代码代码如下所示:
/ / topsort()函数
功能topsort(){
var堆栈{ };
var访问= {;
对于(var i = 0;i < this.vertices;i++){
访问{ = false = false;
}
对于(var i = 0;i < this.vertices;i++){
如果(访问{ = false = false){
This.topSortHelper(我去过,堆栈);
}
}
对于(var i = 0;i < stack.length;i++){
如果(堆栈{ })!=未定义堆栈{ }!= false){
打印(这个。vertexlist { } } {我栈);
}
}
}
/ / topsorthelper()函数
功能topsorthelper(V,访问,堆栈){
访问过;
对于每一个(这个w中的var w){
如果(!访问{ { }){
This.topSortHelper(访问{W},访问,堆栈);
}
}
Stack.push(V);
}