有向图的介绍

引入

  • 在实际生活中,很多应用相关的图都是有方向性的,最直观的就是网络,可以从A页面通过链接跳转到B页面,那么a和b连接的方向是a->b,但不能说是b->a,此时我们就需要使用有向图来解决这一类问题,它和我们之前学习的无向图,最大的区别就在于连接是具有方向的,在代码的处理上也会有很大的不同。

定义

  • 有向图(Digraph或Directed graph)是一副由一系列顶点和连接顶点之间的具有方向性的边组成的图

    这是一幅简单的有向图示意,其中双向箭头的边实际上是由两条不同的边组成的

有向图的术语

  • 出度:由某个顶点指出的边的个数称为该顶点的出度。
  • 入度:指向某个顶点的边的个数称为该顶点的入度。
  • 有向路径:由一系列顶点组成,对于其中的每个顶点都存在一条有向边,从它指向序列中的下一个顶点。
  • 有向环:至少含有一条边,且起点和终点相同的有向路径。

一副有向图中两个顶点v和w可能存在以下四种关系:

  1. 没有边相连;
  2. 存在从v到w的边v- ->W;
  3. 存在从w到v的边w- ->v;
  4. 既存在w到v的边,也存在v到w的边,即双向连接;

有向图的实现

属性方法设计

类名:Edge

  1. 构造方法__init__()中的属性
    num_vertices和num_edges分别代表要构造的图的顶点和边的数量;adj_list是一个列表,其索引代表顶点,储存的值是与索引对应顶点相邻的全部顶点
  2. point_edge(x, y) 对传入的两个顶点x,y构造一条边:x→y
  3. point_to_vertices(x) 获取传入的顶点x所有指出的顶点
  4. reverse_digraph() 将当前图中的所有边的方向反转获得一张反转图并返回

Python代码实现

class Digraph:def __init__(self, num):self.num_vertices = numself.num_edges = 0self.adj_list = [[] for _ in range(num)]def count_vertices(self):return self.num_verticesdef count_edges(self):return self.num_edgesdef point_edge(self, x, y):"""Add an edge of vertex x: x --> y"""self.adj_list[x].append(y)def point_to_vertices(self, x):return self.adj_list[x]def reverse_digraph(self):rvs_digraph = Digraph(self.num_vertices)for index, queue in enumerate(self.adj_list):for v in queue:rvs_digraph.point_edge(v, index)return rvs_digraphif __name__ == '__main__':graph = Digraph(5)graph.point_edge(3, 0)graph.point_edge(0, 2)graph.point_edge(2, 0)graph.point_edge(2, 1)graph.point_edge(1, 0)graph.point_edge(1, 4)print(graph.point_to_vertices(1))print(graph.adj_list)rvs_graph = graph.reverse_digraph()print(rvs_graph.adj_list)

运行结果

[0, 4]
[[2], [0, 4], [0, 1], [0], []]
[[1, 2, 3], [2], [0], [], [1]]

数据结构之图:有向图的介绍与实现,Python代码实现——25相关推荐

  1. 数据结构之图:用图解决案例,Python代码实现——24

    用图解决畅通工程案例与途径查找 代码中需要引入的类方法代码链接: 无向图Undigraph 深度优先搜索DFS与广度优先搜索BFS 畅通工程-续 介绍 案例和之前并查集中实现的一样,但问题略有改动,需 ...

  2. 数据结构之图:有向图的拓扑排序,Python代码实现——26

    有向图的拓扑排序 拓扑排序介绍 什么是拓扑排序? 一个有向图的拓扑排序(Topological sort 或 Topological ordering)是根据其有向边从顶点U到顶点V对其所有顶点的一个 ...

  3. 【恋上数据结构】图基础知识介绍

    图 数据结构回顾 图(Graph) 有向图(Directed Graph) 出度.入度 无向图(Undirected Graph) 混合图(Mixed Graph) 简单图.多重图 无向完全图(Und ...

  4. k近邻回归算法python_K近邻算法用作回归的使用介绍(使用Python代码)

    介绍 在我遇到的所有机器学习算法中,KNN是最容易上手的.尽管它很简单,但事实上它其实在某些任务中非常有效(正如你将在本文中看到的那样). 甚至它可以做的更好?它可以用于分类和回归问题!然而,它其实更 ...

  5. 数据结构之优先队列:最小索引优先队列,Python代码实现——15

    最小索引优先队列(Min index priority queue) 在之前实现的最大优先队列和最小优先队列,他们可以分别快速访问到队列中最大元索和最小元素,但是他们有一 个缺点,就是没有办法通过索引 ...

  6. knn算法python理解与预测_K近邻算法用作回归的使用介绍(使用Python代码)

    介绍 在我遇到的所有机器学习算法中,KNN是最容易上手的.尽管它很简单,但事实上它其实在某些任务中非常有效(正如你将在本文中看到的那样). 甚至它可以做的更好?它可以用于分类和回归问题!然而,它其实更 ...

  7. k近邻回归算法python_K-近邻回归算法的实用介绍(附Python代码)

    介绍 在我所遇到的所有机器学习算法中,KNN很容易被选择.尽管它很简单,但它在某些任务上被证明是非常有效的(如本文中所见). 甚至更好?它可以用于分类和回归问题!然而,它更广泛地用于分类问题.我很少看 ...

  8. 数据结构之二叉树:二叉查找树基本功能,Python代码实现——10

    数据结构之二叉查找树的代码实现 定义 二叉查找树(Binary Search Tree,BST),是一种内存中特殊的树类型的存储结构,它允许对存储在其结点的数据进行增删改查,或者用作动态的数据集合,或 ...

  9. 机器学习——BP神经网络详细介绍及案例Python代码实现

    哒哒!来咯!来喽! BP(Back Propagation)称误差反向传播,1985年由Rumelhart 和 McCelland提出.神经元函数如图: (一).举个通俗易懂的例子:假如,我说的是假如 ...

最新文章

  1. Android4.2以后,多屏幕的支持 学习(一)
  2. python计算机体系三层结构_Python tkinter 实现简单登陆注册 基于B/S三层体系结构,实现用户身份验证...
  3. JAVA那点破事,并发、IO模型、集合、线程池、死锁、非阻塞、AQS...
  4. 数据有为 智在决策 | 观远数据2019智能决策峰会圆满落幕
  5. 我对安卓recovery的流程大致总结
  6. hadoop官方hdfs操作说明
  7. 计算机每个人都适合学吗,代码不等于计算机科学:为什么所有人都应该学习编程...
  8. python安装error: Unable to find vcvarsall.bat
  9. mysql数据库事务实现方式_mysql事务的实现原理
  10. Windows下安装numpy
  11. 小程序 长按转发_微信小程序实现限制用户转发功能的实例代码
  12. 一文读懂电感器的原理、结构、作用及分类
  13. Linux安装杀毒软件clamav
  14. 微信公众号开发(一) 微信网页授权登录
  15. 给红米Note 4X编译LineageOS 14.1刷机包过程【详细】
  16. BZOJ1733: [Usaco2005 feb]Secret Milking Machine 神秘的挤奶机
  17. 安卓实现浏览器app
  18. Python开发mysql和mongo 连接类
  19. A001 - 基础 - 交换机原理简述
  20. java虚拟机原理(java虚拟机的基本结构)

热门文章

  1. String s1==s2面试题
  2. 网络爬虫--2.HTTP和HTTPS
  3. ubuntu18.04安装mysql数据库
  4. mysql concat例子_MYSQL中CONCAT详解
  5. 《操作系统》OS学习(十):进程控制
  6. Java笔记01-数组相关
  7. python中函数的参数传递(传值还是传引用)
  8. Pytorch的BatchNorm层使用中容易出现的问题
  9. Halcon学习笔记(三)---数据类型
  10. 更新10_linux,时隔十年,QQ更新了Linux版本