数据结构(四) 图(Graph)
在图形结构中,结点之间的关系可以是任意的。
一、图
图由定点(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)的更多相关文章
- 算法与数据结构基础 - 图(Graph)
图基础 图(Graph)应用广泛,程序中可用邻接表和邻接矩阵表示图.依据不同维度,图可以分为有向图/无向图.有权图/无权图.连通图/非连通图.循环图/非循环图,有向图中的顶点具有入度/出度的概念. 面 ...
- 算法与数据结构(四) 图的物理存储结构与深搜、广搜(Swift版)
开门见山,本篇博客就介绍图相关的东西.图其实就是树结构的升级版.上篇博客我们聊了树的一种,在后边的博客中我们还会介绍其他类型的树,比如红黑树,B树等等,以及这些树结构的应用.本篇博客我们就讲图的存储结 ...
- 纸上谈兵: 图 (graph)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 图(graph)是一种比较松散的数据结构.它有一些节点(vertice),在某些节 ...
- python数据结构之图的实现
python数据结构之图的实现,官方有一篇文章介绍,http://www.python.org/doc/essays/graphs.html 下面简要的介绍下: 比如有这么一张图: A -> B ...
- 学习javascript数据结构(四)——树
前言 总括: 本文讲解了数据结构中的[树]的概念,尽可能通俗易懂的解释树这种数据结构的概念,使用javascript实现了树,如有纰漏,欢迎批评指正. 原文博客地址:学习javascript数据结构( ...
- 20162327WJH实验四——图的实现与应用
20162327WJH实验四--图的实现与应用 实 验 报 告 课程:程序设计与数据结构 班级: 1623 姓名: 王旌含 学号:20162327 成绩: 指导教师:娄嘉鹏 王志强 实验日期:11月2 ...
- 利用python+graphviz绘制数据结构关系图和指定目录下头文件包含关系图
作为一名linux系统下的C语言开发,日常工作中经常遇到两个问题: 一是分析代码过程中,各种数据结构互相关联,只通过代码很难理清系统中所有结构体的整体架构,影响代码消化的效率; 二是多层头文件嵌套包含 ...
- python数据结构之图的实现方法
python数据结构之图的实现方法 本文实例讲述了python数据结构之图的实现方法.分享给大家供大家参考.具体如下: 下面简要的介绍下: 比如有这么一张图: A -> B A ...
- python数据结构之图深度优先和广度优先实例详解
本文实例讲述了python数据结构之图深度优先和广度优先用法.分享给大家供大家参考.具体如下: 首先有一个概念:回溯 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到 ...
- hdu 1233:还是畅通工程(数据结构,图,最小生成树,普里姆(Prim)算法)
还是畅通工程 Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
随机推荐
- LeetCode---Backtracking && DP
**322. Coin Change 思路:动态规划,构造一个数组,存入当前index最少需要多少个coin public int coinChange(int[] coins, int amount ...
- JSP自定义标签的执行原理
当浏览器发来请求后,会将这个请求交给JSP翻译成的servlet来处理,自定义标签对应servlet中一个方法的调用,这个方法主要步骤如下 1,产生标签处理类的实例对象 2,将pageContext传 ...
- smarty中ifelse、foreach以及获取数组中键值名的一个实例
<{if empty($history)}> <tr> <td colspan="6">Not any records!</td> ...
- git下载fastadmin
mac git下载后,环境配置运行会如下图 一 下载相对应系统的node.js https://nodejs.org/en/download/ 安装就是一直下一步.... 二 指令终端.cd 到对应项 ...
- 卸载apache
1.查看httpd相关软件包 rpm -qa|grep httpd 2.卸载命令, “rpm -e 软件或服务名” 如果出现类似“httpd >= 2.2.0 is needed by (ins ...
- 如何查看 SELinux状态及关闭SELinux
查看SELinux状态: 1./usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态 SELinux status: ...
- rocketmq的以集群模式MessageModel.CLUSTERING实现消费者集群消费消息,实现负载均衡
package com.bfxy.rocketmq.model; import java.util.List; import org.apache.rocketmq.client.consumer.D ...
- Orcal设置默认插入数据的日期和时间
CREATE TABLE TEST_DATE_TIME( id integer, operdate )default "TO_CHAR"(SYSDATE,'yyyy-MM-dd') ...
- LC 856. Score of Parentheses
Given a balanced parentheses string S, compute the score of the string based on the following rule: ...
- 日志框架之Logger
概述 在我们日常的开发中,肯定是少不了要和 Log 打交道,回想一下我们是怎么使用 Log 的:先定义一个静态常量 TAG,TAG 的值通常是当前类的类名,然后在需要打印 Log 的地方,调用 Log ...