在图形结构中,结点之间的关系可以是任意的。

一、图

  图由定点(vertex)和边(edge)两个有限集合组成:

Graph=(V,R)

  V是定点集,R={E},E是边集。

  有向图(directed network):从一个顶点指向另一个顶点。用有序对<u,v>表示

  无向图:用无序对(u,v)代替有序对。

  有向网:有向图的边上有正的权值。

  无向网:无向图的边上有正的权值。

  n为图中顶点数,e为图中边数,不考虑顶点到自身的边:

  (1)对无向图而言, e在[0,n(n+1)/2]范围内。满边称为完全图;

  (2)对有向图,e在[0,n(n-1)],满边称为有向完全图。

  有较少条边的图称为稀疏图,有较多条边的图称为稠密图。

  图中顶点的度degree:

  无向图中即为与顶点相关联的边的数目;

  有向图中:顶点有入度和出度,顶点的度数为两者之和。

  图中路径的定义:顶点序列中,任意序列相邻顶点的构成的边都存在,则称顶点序列构成一条长度为n-1的路径,路径长度是指包含的边的条数。

  如果路径上各个顶点都不同,则为简单路径。

  路径中如果首尾的顶点是同一个,则构成回路。

  一条回路中,除了起点与终点相同外,其它顶点都不相同,则为简单回路,或简单环

  一个无向图中任意两个不同的顶点都存在从一个顶点到另一个顶点的路径,则称此无向图是联通的(connected),无向图的极大联通子图称为联通分量

  对于有向图,如果一个有向图中任意两个不同的顶点u和v,都存在从顶点u到顶点v的路径,则称此有向图是强连通的,有向图的极大联通子图称为强连通分量。

  连通图的极小连通子图称为连通图的生成树,生成树包含图中全部n个顶点,只有n-1条边,并且任加新一条边,必将构成回路。

二、图的存储

  最常用的两种:邻接矩阵和邻接表。

三、图的遍历

图的遍历算法一般是从一个起始顶点出发,试图访问全部顶点,则必须解决:

  (1) 从起点出发可能到达不了所有其它顶点(如非连接图);

  (2) 有些图存在回路,必须确定算法不会因回路而陷入死循环。

  解决办法是,为图的每个顶点保留一个标志(tag),在算法开始时,所有顶点的标志设置为false,遍历过程中,如某个顶点被访问,则置为true。后面再遇到tag为true 的点,就不访问,避免陷入死循环。

  若图是不联通的,则还有未被访问的顶点,这些顶点的标志值为false,这时可以从某个未被访问到的顶点开始继续搜索。

深度优先搜索DFS:

搜索过程中,每当访问某个顶点V后,DFS将递归地访问它的所有未被访问到的邻接的顶点,实际结果是沿着图的某一分支进行搜索,直到末端,再进行回溯,沿另一分支进行搜索。结果将产生一棵深度优先搜索树。

时间复杂度与图的存储结构有关,主要花费在对每个顶点寻找邻接点的过程上。

广度优先搜索BFS:

以顶点V为起点,由近至远依次访问和V有路径相通且长度为1,2,…的顶点,知道所有被访问的顶点的邻接点都被访问完。若这时图中还有未被访问的顶点,选择一个未被访问的顶点作为起始点继续进行搜索,直到图中所有顶点都被访问完为止。

时间复杂度是一样的。

四、连通无向网的最小代价生成树

  最小代价生成树MST,对于一个给定连通网Net,最小代价生成树包括Net中所有顶点和部分边,且满足下列条件:

  (1)    MST边的条数是顶点个数减1,并且保证MST是连通的;

  (2)    MST边上的权值之和最小。

  构造最小代价生成树的两种算法:

  Prim算法——直到有n-1条边(从顶点出发);

  Kruskal算法——直到所有的顶点在同一颗树上(从边入手);

五、有向无环图(Direxted Acyclic Graph)

判断有向无环图:拓扑排序or深度优先搜索,DFS(v)结束之前出现一条从顶点u到v的回边,则必定存在包含顶点u和v的回路。

  1、  拓扑排序

  2、  关键路径

六、最短路径

  1、 单源点最短路径问题

  2、 所有顶点之间的最短路径问题

数据结构(四) 图(Graph)的更多相关文章

  1. 算法与数据结构基础 - 图(Graph)

    图基础 图(Graph)应用广泛,程序中可用邻接表和邻接矩阵表示图.依据不同维度,图可以分为有向图/无向图.有权图/无权图.连通图/非连通图.循环图/非循环图,有向图中的顶点具有入度/出度的概念. 面 ...

  2. 算法与数据结构(四) 图的物理存储结构与深搜、广搜(Swift版)

    开门见山,本篇博客就介绍图相关的东西.图其实就是树结构的升级版.上篇博客我们聊了树的一种,在后边的博客中我们还会介绍其他类型的树,比如红黑树,B树等等,以及这些树结构的应用.本篇博客我们就讲图的存储结 ...

  3. 纸上谈兵: 图 (graph)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 图(graph)是一种比较松散的数据结构.它有一些节点(vertice),在某些节 ...

  4. python数据结构之图的实现

    python数据结构之图的实现,官方有一篇文章介绍,http://www.python.org/doc/essays/graphs.html 下面简要的介绍下: 比如有这么一张图: A -> B ...

  5. 学习javascript数据结构(四)——树

    前言 总括: 本文讲解了数据结构中的[树]的概念,尽可能通俗易懂的解释树这种数据结构的概念,使用javascript实现了树,如有纰漏,欢迎批评指正. 原文博客地址:学习javascript数据结构( ...

  6. 20162327WJH实验四——图的实现与应用

    20162327WJH实验四--图的实现与应用 实 验 报 告 课程:程序设计与数据结构 班级: 1623 姓名: 王旌含 学号:20162327 成绩: 指导教师:娄嘉鹏 王志强 实验日期:11月2 ...

  7. 利用python+graphviz绘制数据结构关系图和指定目录下头文件包含关系图

    作为一名linux系统下的C语言开发,日常工作中经常遇到两个问题: 一是分析代码过程中,各种数据结构互相关联,只通过代码很难理清系统中所有结构体的整体架构,影响代码消化的效率; 二是多层头文件嵌套包含 ...

  8. python数据结构之图的实现方法

    python数据结构之图的实现方法 本文实例讲述了python数据结构之图的实现方法.分享给大家供大家参考.具体如下: 下面简要的介绍下: 比如有这么一张图:     A -> B     A ...

  9. python数据结构之图深度优先和广度优先实例详解

    本文实例讲述了python数据结构之图深度优先和广度优先用法.分享给大家供大家参考.具体如下: 首先有一个概念:回溯 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到 ...

  10. hdu 1233:还是畅通工程(数据结构,图,最小生成树,普里姆(Prim)算法)

    还是畅通工程 Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

随机推荐

  1. 「Luogu P5602」小E与美食

    题目链接 戳我 \(Solution\) 这道题只需要枚举吃\(k\)个美食,最后在取前\(k\)大的美味值.对于每个算出答案后取\(max\) \(Code\) #include<bits/s ...

  2. django分页模块--django-pure-pagination

    Django自带有分页的两个类,但是用起来没有第三方这个分页模块方便,下面介绍一下这个模块的使用方法. 1. 安装模块: pip install django-pure-pagination 2.   ...

  3. mongoRepository 支持的所有接口

    与HibernateRepository类似,通过继承MongoRepository接口,我们可以非常方便地实现对一个对象的增删改查,要使用Repository的功能,先继承MongoReposito ...

  4. lamp 环境利用compser安装tp5

    1.安装compser,这个可以去百度命令 2.cd到根目录 3.composer create-project --prefer-dist topthink/think tp(tp可以随意命名) 4 ...

  5. vue-cli 3x 的使用

    当我们使用 npm 下载过文件之后,里面就会有缓存 我们要使用 npm cache clean --force 来清除缓存 创建项目:vue create 文件名 然后:cd 文件名 启动程序:npm ...

  6. linux vim的全目录搜索 和 hostname的设置?

    vim下的搜索命令是: vimgrep, 简写就是vim. 关于这个全局搜索的用法根grep的差不多, 但是, 如果你直接使用 grep的话 就会在vim的外部执行, 根vim内部就没有什么关系了, ...

  7. 求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123,相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0。方法是先将整型数字转换到数组中,再判断。函数为 int same(int num)其中num是输入的整型数字

    import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Test { pub ...

  8. linux常用命令(9)nl命令

    nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...

  9. python--Email提醒

    发送邮箱的协议是STMP,python内置对SMTP支持,可以发送纯文本邮件,HTML邮件和带附件邮件.python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtp ...

  10. typeScript入门配置

    typeScript是有微软开发的一款开源的编程语言. TypeScript是JavaScript的一个超集,从今天数以百万计的JavaScript开发者所熟悉的语法和语义开始.可以使用现有的Java ...