图(Graphs)

图由边的集合及顶点的集合组成,每个城市就是一个顶点,每一条道路就是一个边

顶点也有权重,也称为成本。如果一个图的顶点对是有序的,则称之为有向图。在对有向图中的顶点排序后,便可以在两个顶点之间绘制一个箭头。有向图表明了顶点的流向。流程图就是一个有向图的例子

如果图是无序的,则称之为无序图或无向图

从一个节点走到另一个节点的这一组边称为路径。路径中所有的顶点都由边连接。路径的长度用路径中第一个顶点到最后一个顶点之间边的数量表示,指向自身的顶点组成的路径称为,环的长度为0

圈是至少有一条边的路径,且路径的第一个顶点和最后一个顶点相同。无论有向图还是无向图只要是没有重复的顶点的圈就是一个简单圈,除了第一个和最后一个顶点以外,路径的其他顶点有重复的圈称为平凡圈

如果两个顶点之间有路径,那么这两个顶点之间就是强连通的,如果有向图的所有顶点都是强连通的,那么这个有向图也是强连通的

图的遍历

广度优先搜索(BFS)

从第一个顶点开始,尝试访问尽可能靠近它的顶点

深度优先搜索(DFS)

访问一个没有访问过的顶点,将他标记为已访问,再递归地去访问在初始顶点的邻接表中其他没有访问过的顶点

js实现

/*** 一个简单的图和图算法* @constructor*/
function Graph(v) {this.vertices = v    //顶点this.edges = 0       //边this.adj = []          //定义数组this.marked = []  //标记是否已访问 false为未访问 true为访问过了for (var i = 0; i < this.vertices; i++) {           //定义二维数组this.adj[i] = []this.marked[i] = false}this.addEdge = addEdge  //添加顶点this.show = show  //显示顶点this.dfs = dfs      //深度优先搜索this.bfs = bfs      //广度优先搜索this.edgeTo = []  //从一个顶点到下一个顶点的所有边this.hasPathTo = hasPathTo //是否有路径this.pathTo = pathTo //最短路径
}//添加顶点
function addEdge(v, m) {this.adj[v].push(m)this.adj[m].push(v)this.edges++
}//显示顶点
function show() {for (var i = 0; i < this.vertices; i++) {var edges = ''for (var j = 0; j < this.vertices; j++) {if (this.adj[i][j]) {edges += this.adj[i][j] + ' '}}console.log(i + '->' + edges)}
}//深度优先搜索
function dfs(v) {this.marked[v] = trueif (this.adj[v] !== undefined) {console.log(v + '该节点被访问了')}for (var w in this.adj[v]) {var current = this.adj[v][w]if (!this.marked[current]) {this.dfs(current)}}
}//广度优先搜索
function bfs(v) {var queue = []this.marked[v] = truequeue.push(v)while (queue.length > 0) {var s = queue.shift()if (s !== undefined) {console.log(s + '该节点被访问了')}for (var w in this.adj[s]) {var current = this.adj[s][w]if (!this.marked[current]) {this.marked[current] = truethis.edgeTo[current] = squeue.push(current)}}}
}//是否有路径
function hasPathTo(v) {return this.marked[v]
}
//最短路径
function pathTo(v) {var source = 0if(!this.hasPathTo(v)) return undefinedvar path =[]for(var i=v; i!=source;i=this.edgeTo[i]) {path.push(i)}path.push(source)return path
}var graph = new Graph(6)
graph.addEdge(0, 1)
graph.addEdge(0, 2)
graph.addEdge(2, 4)
graph.addEdge(1, 3)
graph.addEdge(3, 4)
graph.addEdge(3, 5)
graph.addEdge(4, 5)
graph.show()
console.log('=======深度优先搜索=========')
// graph.dfs(0)
console.log('=======广度优先搜索=========')
graph.bfs(0)
var paths = graph.pathTo(5)
var str = ''
while(paths.length>0){if(paths.length>1) {str += paths.pop()+'->'}else {str +=paths.pop()}
}
console.log(str)复制代码

js实现数据结构及算法之图和图算法(Graphs)相关推荐

  1. python函数结构图_Python数据结构与算法之图结构(Graph)实例分析

    本文实例讲述了Python数据结构与算法之图结构(Graph).分享给大家供大家参考,具体如下: 图结构(Graph)--算法学中最强大的框架之一.树结构只是图的一种特殊情况. 如果我们可将自己的工作 ...

  2. python define graph_Python数据结构与算法之图结构(Graph)实例分析

    本文实例讲述了Python数据结构与算法之图结构(Graph).分享给大家供大家参考,具体如下: 图结构(Graph)--算法学中最强大的框架之一.树结构只是图的一种特殊情况. 如果我们可将自己的工作 ...

  3. python棋盘最短路径_Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例...

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  4. 特征图注意力_从数据结构到算法:图网络方法初探

    作者 | 朱梓豪 来源 | 机器之心 原文 | 从数据结构到算法:图网络方法初探 如果说 2019 年机器学习领域什么方向最火,那么必然有图神经网络的一席之地.其实早在很多年前,图神经网络就以图嵌入. ...

  5. 数据结构与算法之-----图(拓扑排序)

    [​​​​​​​ 写在前面的话:本专栏的主要内容:数据结构与算法. 1.对于​​​​​​​初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据 ...

  6. 数据结构与算法之-----图(搜索算法)

    [ 写在前面的话:本专栏的主要内容:数据结构与算法. 1.对于​​​​​​​初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据结构,也是自己 ...

  7. 数据结构与算法之图的应用

    数据结构与算法之图的应用 图的定义和基本概念 图的实现 数组〈邻接矩阵〉 邻接表 图的应用 最小生成树 Prim(普里姆)算法 Kruskal(克鲁斯卡尔)算法 最短路径 迪克斯特拉算法 拓扑排序 执 ...

  8. 数据结构与算法--符号图

    数据结构与算法--符号图 为了计算简单,传统的图中,都是使用整数来表示顶点,这样难免会有点抽象,不能直接反映各个顶点代表的信息.在实际生活中,使用图时一般会建立一个一一对应的关系表,如下 顶点 0 1 ...

  9. js数据结构和算法(8)-图

    8-图(第11章) 8.1 图的定义 图是一种非线性结构,由一系列顶点及其连接顶点的边组成.比如A和B.A和D是相邻的,而A和E不是相邻的.一个顶点相邻顶点的数量叫作度,比如A的度为3.D的度为4.路 ...

最新文章

  1. [设计模式]外观模式
  2. boost::mp11::mp_eval_or相关用法的测试程序
  3. 解决 Gradle 进行多模块开发时,模块相互依赖的问题
  4. Docker Hello World容器运行报错的解决办法
  5. USACO Training Section 1.2 挤牛奶Milking Cows
  6. 懂程序员的产品经理是什么样子?
  7. 糖豆人显示此服务器正在进行游戏,糖豆人服务器频繁崩溃,west滚石教技巧,蓝哥踢球做内鬼...
  8. pyqt5中控件缩放功能_python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例...
  9. 【基础】如何理解LSTM后接CRF?
  10. 混合颜料-python实现
  11. 未来,能源枯竭可以逆转吗?
  12. ClickHouse偶现 读取数据超时
  13. 临时文件传输工具推荐
  14. vim底部查找最后一个关键字
  15. Spring框架技术总结(一),java编程自学教程
  16. 【报错】InternalExceptionException got error code in reply:34
  17. 安全锁界面,防止底部上滑触发人脸解锁与绘制图案锁冲突
  18. java计算机毕业设计基于springboo+vue的医院挂号体检预约系统
  19. python curses_python curses 使用
  20. STM32的最小系统组成的详解

热门文章

  1. “我的开源项目被威胁了!”
  2. 漫话:如何给女朋友解释什么是缓存穿透、缓存击穿、缓存雪崩?
  3. .NET 页面间传值的几种方法
  4. VOICE VOER IP(VoIP)理论(NP水平学的)
  5. 2018-2019-2 20165313 《网络对抗技术》Exp4 恶意代码分析
  6. Python第三周 学习笔记(2)
  7. Unity UGUI——遮罩效果(Mask)
  8. Android入门第八篇之GridView(九宫图)
  9. JDBC:使用连接池管理连接
  10. 对计算机科学技术的看法