第六章 图(一).

Slides:



Advertisements
Similar presentations
三级偏软考点. 第一章必考点 1. 计算机的进位数制 (1) 计算机中所有数据是二进制 0,1 表示 (2) 在现实生活中人们普遍使用十进制 如何把十进制转换成计算机所识别的二 进制?整数是除 2 取余法,小数是乘 2 取 整法.
Advertisements

第七章 图 7.1 图的定义和术语 7.2 图的存储结构 7.3 图的遍历 7.4 图的连通性问题 7.5 有向无环图及其应用
复习:树 树的基本概念和术语 二叉树的概念及性质 二叉树的存储结构 遍历二叉树 线索二叉树 树的应用:哈夫曼树 顺序存储 链式存储 递归算法
图 2008赛前知识点梳理三.
数据结构 第7章 图.
第七章 图 (Graph)
Ch.7 图 图是一种复杂的非线性结构 应用:AI、工程、数学、生物、计算机 结点间的逻辑关系:任两个结点都可能相关
第9章 图 图的基本概念 图的存储结构 图的实现 图的遍历 最小生成树 最短路径 拓扑排序 关键路径 主要知识点.
第3章 算法与数据结构_c语言描述 3.1 计算机的问题求解模型 3.2 C语言基础 3.3 算法与数据结构的基本概念 3.4 线性结构
第七章 图 7.1 图的基本概念 7.2 图的存储表示 7.3 图的遍历 7.4 图的生成树 7.5 最短路径 7.6 拓扑排序
图(一).
第七章 图 1、图的基本概念 2、图的存储表示 3、图的遍历与连通性 4、最小代价生成树 5、最短路径问题 6、AOV网络和AOE网络.
图的遍历.
Chapter 6 Graphs.
复习.
强连通分量 无向图 1、任意两顶点连通称该图为连通图 2、否则将其中的极大连通子图称为连通分量 A D C B E 有向图
第七章 图.
7.1 抽象数据类型图的定义 7.2 图的存储表示 7.3 图的遍历 7.4 最小生成树 7.5 重(双)连通图和关节点
第七章 图.
知识点回顾 生成树、生成森林 概念、生成过程 最小生成树 概念、 MST 性质 普里姆算法和克鲁斯卡尔算法.
第 4章 串和数组(二) 本讲主要内容: 数组的定义及其顺序表示和实现。 矩阵的压缩存储。 广义表的定义。
第七章 图 知识点2:图的存储结构.
第七章 图 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
第7章 图 本章主题:图的基本概念、图的存储结构和图的常用算法 教学目的: 教学重点:图的各种存储方式及其运算
第6章 图 6.2图的存储结构 6.3图的遍历 6.4图的连通性 6.5 最短路径 6.6 AOV网与拓扑排序 6. 7 AOE网与关键路径
数据结构 复习课 王彦 博士,副教授
第七章 图.
数据结构 Data Structure CSU 主讲人:王国军,郑瑾 中南大学信息院计科系
第6章 图 北京师范大学 教育技术学院 杨开城.
数据结构 芦溪中学 胡小妹.
第7章 图 7.1 图的定义和术语 7.2 图的存储结构 7.3 图的遍历 7.4 图的连通性问题 7.5 有向无环图的应用
第七章 图.
使用矩阵表示 最小生成树算法.
无向树和根树.
第 五 章 图 论 (第二部分) 1. 通路 2. 图的连通性.
数据结构概论 第7章 图 董黎刚 浙江工商大学信电学院 2019年4月8日.
第6章 图 本章中介绍下列主要内容: 图的定义 图的存储结构 图的遍历操作 图的几个典型问题.
知识点回顾 拓扑排序 关键路径 应用领域、求解步骤、算法实现过程 应用领域 求解步骤
第八章 图 图的基本概念 图的存储表示 图的遍历与连通性 最小生成树 最短路径 活动网络.
Graphs.
8.1 图的基本概念 8.2 图的存储结构 8.3 图的遍历 8.4 生成树 8.5 最短路径 8.6 拓扑排序 8.7 关键路径
数据结构学位考 复习课(3) 主要内容: 1. 图 2.查找、排序.
线段的有关计算.
复习 图的定义和术语 图(Graph)、有向图、无向图、子图、有向完全图 、完全图、稀疏图、稠密图、权、网、邻接点、相关边、度、路径、路径长度、回路、简单路径、简单回路、连通、连通图、连通分量、强连通图、强连通分量、生成树 图的存储方法 给定一个图,画出邻接矩阵、邻接表 图的邻接矩阵和邻接表的存储算法.
顺序表的删除.
线 性 代 数 厦门大学线性代数教学组 2019年4月24日6时8分 / 45.
单链表的基本概念.
常宝宝 北京大学计算机科学与技术系 数据结构(六) 常宝宝 北京大学计算机科学与技术系
第 四 讲 线性表(二).
第8章 图 8.1 图的基本概念和基本操作 8.2 图的邻接矩阵存储结构 8.3 图的邻接表存储结构 8.4 图的其他存储结构
知识点回顾 图的深度优先和广度优先遍历思想 图的深度优先遍历算法(用邻接表作为存储结构) 图的广度优先遍历算法(用邻接矩阵作为存储结构)
树和图 tree and graph 蔡亚星.
第七、八次实验要求.
第六章 图 本章的主要内容是: 图的逻辑结构 图的存储结构及实现 图的连通性 最小生成树 最短路径 AOV网与拓扑排序 AOE网与关键路径.
第15讲 特征值与特征向量的性质 主要内容:特征值与特征向量的性质.
实验目的:掌握数据的顺序存储结构及它们在计算机中的操作。 实验内容:
最小生成树.
基于列存储的RDF数据管理 朱敏
定义5 把矩阵 A 的行换成同序数的列得到的矩阵,
第七章 图 £7.1 图的定义和术语 £7.2 图的存储结构 £7.3 图的遍历 £7.4 图的连通性问题 £7.5 有向无环图及其应用
4.2 图的存储结构(cont.) v1 v2 v3 v4 v5 vertex= v1 v2 v3 v4 v5 v
第六章 图.
数据结构 第六章 图.
第三部分 图论 本部分主要内容 图的基本概念 树 欧拉图与哈密顿图 二部图与匹配 平面图 着色.
第7章 图.
§4.5 最大公因式的矩阵求法( Ⅱ ).
第二章 线性表 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
1、图的基本概念 2、图的存储结构 3、图的遍历与连通性
最小生成树 最优二叉树.
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
Presentation transcript:

第六章 图(一)

复习 Huffman树的构造方法 Huffman编码基本规则

第六章 图 6.1 图的定义和术语 6.2 图的存储结构 6.3 图的遍历 6.4 图的连通性问题 6.5 有向无环图及其应用 6.6 最短路径

本讲主要内容 理论: 主要讲解图的定义和术语、图的存储结构。 实验: 建立无向图(有向图)的邻接矩阵和邻接表算法。

6.1 图的定义和术语 图(Graph):图G是由两个集合V(G)和E(G)组成的,记为G=(V,E) 其中:V(G)是顶点的非空有限集 有向图:E(G)是有向边(也称弧)的有限集合,弧是顶点的有序对,记为<v,w>,v,w是顶点,v为弧尾,w为弧头 无向图:E(G)是边的有限集合,边是顶点的无序对,记为(v,w)或(w,v),并且(v,w)=(w,v)

E(G1)={(1,2), (1,3), (2,3), (2,4),(2,5), (5,6), (5,7)} 例 2 4 5 1 3 6 G1 图G1中:V(G1)={1,2,3,4,5,6} E(G1)={<1,2>, <2,1>, <2,3>, <2,4>, <3,5>, <5,6>, <6,3>} 例 1 5 7 3 2 4 G2 6 图G2中:V(G2)={1,2,3,4,5,6,7} E(G1)={(1,2), (1,3), (2,3), (2,4),(2,5), (5,6), (5,7)}

子图——如果图G(V,E)和图G’(V’,E’),满足: V’V E’E 则称G’为G的子图 3 5 6 例 2 4 1 G1 G2

边/弧数目 用n 表示图中顶点数目,用e 表示图中边或弧的数目 有向图:0 ≤ e ≤ n(n-1) 有向完全图 e = n(n-1) 稀疏图: e < nlogn 稠密图 例 2 1 3 有向完全图 完全图

权、网 权:有些图对应每条边有一相应的数值。这个数值叫该边的权。 网:这种带权的图叫网。 注:不同网络的权有不同的意义:电网的权可以是阻抗,运输网络中的权可以是路程长度,运费等。

路径与连通性 邻接点:对无向图G=(V,E),若有(V1,V2)属于E则称V1和V2互为邻接点。 相关边:两个相邻接的点连成的边叫做这两个结点的相关边。 度:与每个顶点相连的边的数叫该点的度。记为TD(V) 无向图中,顶点的度为与每个顶点相连的边数 有向图中,顶点的度分成入度与出度 入度:以该顶点为头的弧的数目,记为ID(V) 出度:以该顶点为尾的弧的数目,记为OD(V) 例 1 5 7 3 2 4 G2 6 顶点5的度:3 顶点2的度:4 例 2 4 5 1 3 6 G1 顶点2入度:1 出度:3 顶点4入度:1 出度:0

路径:路径是顶点的序列V={Vi0,Vi1,……Vin},满足(Vij-1,Vij)E 或 <Vij-1,Vij>E(1<jn) 路径长度:指路径上边或弧的数目 回路:第一个顶点和最后一个顶点相同的路径叫~ 简单路径:序列中顶点不重复出现的路径叫~ 简单回路:除了第一个顶点和最后一个顶点外,其余顶点不重复出现的回路叫~

路径:1,2,3,5,6,3 路径长度:5 简单路径:1,2,3,5 回路:1,2,3,5,6,3,1 简单回路:3,5,6,3 例 2 4 5 1 3 6 G1 例 1 5 7 3 2 4 G2 6 路径:1,2,5,7,6,5,2,3 路径长度:7 简单路径:1,2,5,7,6 回路:1,2,5,7,6,5,2,1 简单回路:1,2,3,1

连通:从顶点V到顶点W有一条路径,则说V和W是连通的 连通图:图中任意两个顶点都是连通的叫~ 连通分量:非连通图的每一个连通部分叫~(极大连通子图) 强连通图:有向图中,如果对每一对Vi,VjV, ViVj,从Vi到Vj 和从Vj到 Vi都存在路径,则称G是~ 强连通分量:有向图中的极大强连通子图 生成树:极小连通子图,一个连通的生成树,它含有图中全部顶点,但只有足以构成树的N-1条边(N顶点个数) 极大、极小是就边数的多少而言的 连通图 例 2 4 5 1 3 6 3 5 6 例 强连通图 例 2 4 5 1 3 6 非强连通图 强连通分量

G3 D E I G H K A C B F L J M A C B F L J M A C B F L J M A C B F L J M 连通分量 D E 生成树 I G H K I G H K I G H K 思考:若无向图中有21条边,则: 1) 保持该图不连通至少应具有多少个顶点? 2) 保持该图连通至少有多少个顶点,至多有多少个顶点? 1) m个顶点形成完全图,另一个顶点与这m个顶点不连通 ½ m(m-1)=21  m=7  n=m+1=8 2) 至少有 7 个顶点(完全图),至多有22个顶点(生成树)

6.2 图的存储结构 图的存储表示分析 特点:顶点之间的关系是多对多(m : n) 也不适合用多重链表表示。 存储结构:数组表示法(邻接矩阵)、邻接表、多重邻接表、十字链表

多重链表 V1 V2 ^ ^ V4 ^ V3 ^ 例 G1 2 4 1 3 例 1 5 3 2 4 G2 ^ V1 V2 V4 ^ V5 ^

6.2 图的存储结构-邻接矩阵 数组表示法(邻接矩阵):表示顶点间相联关系的矩阵 定义:设G=(V,E)是有n1个顶点的图,G的邻接矩阵A是具有以下性质的n阶方阵 网的邻接矩阵定义: 其它

邻接矩阵     例 G1 2 4 1 3      例 1 5 3 2 4 G2      例 1 4 5 2 7 8 6

6.2 图的存储结构-邻接矩阵 无向图/网—对称矩阵 有向图/网—未必是对称矩阵 G3 G2 G1 V1 V2 V1 V2 V1 V2 V3 无向图/网—对称矩阵 有向图/网—未必是对称矩阵 G3 G2 G1 V1 5 V2 V1 V2 V1 V2 4 3 8 7 V3 V6 9 V3 6 1 V3 V4 5 V4 V5 V5 V4 5 V1的度: 第1行或列中值为1的元素个数 V1的出度 V1的入度 V1的出度 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 ∞ 5 ∞ 7 ∞ ∞ ∞ ∞ 4 ∞ ∞ ∞ 8 ∞ ∞ ∞ ∞ 9 ∞ ∞ 5 ∞ ∞ 6 ∞ ∞ ∞ 5 ∞ ∞ 3 ∞ ∞ ∞ 1 ∞

6.2 图的存储结构-邻接矩阵 特点: 无向图的邻接矩阵对称,可压缩存储;有n个顶点的无向图需存储空间为n(n+1)/2 无向图中顶点Vi的度TD(Vi)是邻接矩阵A中第i行元素之和 有向图中, 顶点Vi的出度是A中第i行元素之和 顶点Vi的入度是A中第i列元素之和

邻接矩阵法优点: 缺点: 容易实现图的操作,如:求某顶点的度、判断顶点之间是否有边(弧)、找顶点的邻接点等等。仅耗费 O(1) 时间。 n个顶点需要n*n个单元存储边(弧);空间效率为O(n2)。 对稀疏图而言尤其浪费空间。

建立无向网络邻接矩阵算法 G vexs[4] arcs[4][4] #define INFINITY 32767 typedef char vertype; typedef struct {vextype vexs[n]; int arcs[n][n]; int vexnum,arcnum; }AMGraph; A B C D vexs[4] ∞ arcs[4][4] G A C B D 无向网络 5 7 1 9 5 7 9 5 7 1 9 1

建立无向网络邻接矩阵算法 #define INFINITY 32767 typedef char vertype; typedef struct {vextype vexs[n]; int arcs[n][n]; int vexnum,arcnum; }AMGraph; Status CreateGraph(AMGraph *G ){ int i,j,w; VexType v1, v2; // 输入顶点数、边数 scanf(“%d%d”, & G-> vexnum, G-> arcnum); for(i = 0; i< G-> vexnum; i++) // 读入所有的顶点 scanf(“%c”, & (*G). vexs[i]); for(i = 0; i < G-> vexnum; i++) //初始化邻接矩阵 for(j = 0; j< G-> vexnum; j++) G-> arcs[i][j] = INFINITY; for(i=0; i< G-> arcnum; i++) { // 输入所有的边 // 输入一条边依附的两个顶点和边上的权值 scanf(“%c%c%d”, &v1, &v2, &w); // 查询两个顶点在图中存储的位置 i = LocateVex(&G, v1); j = LocateVex(&G, v2); G-> arcs[i][j].adj = w; G-> arcs[j][i] = G-> arcs[i][j]; } return OK; } 23/

// 查找某个顶点在图中的存储位置(下标),找不到返回-1 int LocateVex(AMGraph *G, VexType vert){ int i; for(i=0; i< G-> vexnum; i++) if(G->vexs[i] = = vert) return i; return -1; } 24/

6.2 图的存储结构-邻接表 实现:为图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边(有向图中指以Vi为尾的弧) 表结点: typedef struct node { int adjvex; //邻接点域,存放与Vi邻接的点在表头数组中的位置 struct node *next; //链域,指示下一条边或弧 }JD; 头结点: typedef struct tnode { int vexdata; //存放顶点信息 struct node *firstarc; //指示第一个邻接点 }TD; TD ga[M]; adjvex next vexdata firstarc

1 2 3 a c d b vexdata firstarc ^ adjvex next 例 G1 b d a c 1 2 3 a c d b vexdata firstarc ^ adjvex next 4 e 例 a e c b d G2

从无向图的邻接表可以得到如下结论: 无向图中顶点Vi的度为第i个单链表中的结点数 所有链表中结点数目的一半为图中边数; 占用的存储单元数目为n+2e 。 G2 V1 V2 V3 V4 V1的度 V5 V1 V2 V3 V4 V5 0 1 2 3 4 1 ^ 0 ^

逆邻接表:有向图中对每个结点建立以Vi为头的弧的单链表 从有向图的邻接表可以得到如下结论: 顶点Vi的出度为第i个单链表中的结点个数 顶点Vi的入度为整个单链表中邻接点域值是i的结点个数 所有链表中结点数目为图中弧数; 占用的存储单元数目为n+e 。 逆邻接表:有向图中对每个结点建立以Vi为头的弧的单链表 V1的出度 V1的入度 G1 V1 V2 V1 V2 V3 V4 0 1 2 3 3 ^ 0 ^ 2 ^ 逆邻接表—入边表 V1 V2 ^ V3 V4 0 1 2 3 1 ^ 0 ^ 3 ^ 邻接表—出边表 V3 V4

邻接表的优点: 邻接表的缺点: 空间效率高;容易寻找顶点的邻接点; 判断任意两顶点间是否有边或弧,需搜索两结点对应的单链表,没有邻接矩阵方便。

图的邻接表存储表示: #define MAX_VERTEX_NUM 20 struct ArcNode{ int adjvex; // 该弧所指向的顶点的位置 struct ArcNode *nextarc; // 指向下一条弧的指针 InfoType *info; // 网的权值指针 } ArcNode; // 表结点 typedef struct{ VertexType data; // 顶点信息 ArcNode *firstarc; // 第一个表结点的地址 } VNode, AdjList[MAX_VERTEX_NUM]; // 头结点 typedef struct { AdjList vertices; int vexnum,arcnum; // 图的当前顶点数和弧数 }ALGraph; 30/

采用邻接表表示法创建无向图 算法思想: (1)依次读入图的各顶点数据并将其存入到头结点数组中,并将表头结点数组的链域均置“空”; (2)逐个输入表示边的顶点序号(i,j)。 对于每一个有效的顶点对(i,j) ,动态生成两个结点,它们的顶点域 分别为j,i,并分别插入到第i个和第j个链表(为简便起见,插入的位置为第一个结点之前)中。 31/

6.2 图的存储结构-十字链表(有向图) 有向图:邻接表-出边表:求入度不方便; 逆邻接表-入边表 十字链表: 弧结点数==弧数 弧结点: typedef struct arcnode { int tailvex, headvex; //弧尾、弧头在表头数组中位置 struct arcnode *hlink;//指向弧头相同的下一条弧 struct arcnode *tlink; //指向弧尾相同的下一条弧 }AD; tailvex headvex hlink tlink 顶点结点: typedef struct dnode { int data; //存与顶点有关信息 struct arcnode *firstin;//指向以该顶点为弧头的第一个弧结点 struct arcnode *firstout; //指向以该顶点为弧尾的第一个弧结点 }DD; DD g[M]; data firstin firstout

例 b d a c a b c d 1 2 3 0 2 0 1 2 3 2 0 3 2 3 1 3 0 ^ ^ ^ ^ ^ ^ ^ ^

6.2 图的存储结构-邻接多重表(无向图) 无向图:邻接表的每条边对应2个表结点 多重邻接表: 边结点数==边数 边结点: typedef struct node { int mark; //标志域 int ivex, jvex; //该边依附的两个顶点在表头数组中位置 struct node *ilink, *jlink; //分别指向依附于ivex和jvex的下一条边 }JD; mark ivex ilink jvex jlink 顶点结点: typedef struct dnode { int data; //存与顶点有关的信息 struct node *firstedge; //指向第一条依附于该顶点的边 }DD; DD ga[M]; //ga[0]不用 data firstedge

例 a e c b d 1 2 3 a c d b 4 e 0 1 0 3 2 3 2 1 2 4 4 1 ^ ^ ^ ^ ^

小结 图的定义和术语 图(Graph)、有向图、无向图、子图、有向完全图 、完全图、稀疏图、稠密图、权、网、邻接点、相关边、度、路径、路径长度、回路、简单路径、简单回路、连通、连通图、连通分量、强连通图、强连通分量、生成树 图的存储方法 邻接矩阵、邻接表、十字链表 、邻接多重表 重点:图的邻接矩阵和邻接表的存储结构,建立无向网络邻接矩阵和邻接表的算法。

作业 1.讨论邻接表与邻接矩阵的异同之处 。 2.编写程序实现有向图的邻接矩阵和邻接表算法。