数据结构第七章 图

合集下载

第7章图_数据结构

第7章图_数据结构

v4
11
2013-8-7
图的概念(3)
子图——如果图G(V,E)和图G’(V’,E’),满足:V’V,E’E 则称G’为G的子图
2 1 4 3 5 6 3 5 6 1 2
v1 v2 v4 v3 v2
v1 v3 v4
v3
2013-8-7
12
图的概念(4)
路径——是顶点的序列V={Vp,Vi1,……Vin,Vq},满足(Vp,Vi1),
2013-8-7 5
本章目录
7.1 图的定义和术语 7.2 图的存储结构

7.2.1 数组表示法 7.2.2 邻接表 ( *7.2.3 十字链表 7.3.1 深度优先搜索 7.3.2 广度优先搜索 7.4.1 图的连通分量和生成树 7.4.2 最小生成树
*7.2.4 邻接多重表 )
7.3 图的遍历
连通树或无根树
无回路的图称为树或自由树 或无根树
2013-8-7
18
图的概念(8)
有向树:只有一个顶点的入度为0,其余 顶点的入度为1的有向图。
V1 V2
有向树是弱 连通的
V3
V4
2013-8-7
19
自测题
7. 下列关于无向连通图特性的叙述中,正确的是
2013-8-7
29
图的存贮结构:邻接矩阵
若顶点只是编号信息,边上信息只是有无(边),则 数组表示法可以简化为如下的邻接矩阵表示法: typedef int AdjMatrix[MAXNODE][MAXNODE];
*有n个顶点的图G=(V,{R})的邻接矩阵为n阶方阵A,其定 义如下:
1 A[i ][ j ] 0
【北方交通大学 2001 一.24 (2分)】

数据结构7-图 完整版

数据结构7-图 完整版
A E C D B
其中: V2={A, B, C, D, E} VR2={(A,B),(A,C),(E,C), (E,D),(D,B) }
5
有向图、无向图示例
A D C
G1
B
1 3
2 4 6
G2
E
5
下列形式的图本章不作讨论
6
完全图、稀疏图与稠密图
n:图中顶点的个数; e:图中边或弧的数目。
2
1 0 3 (a) 1 2 3 (b) 0
q图的应用广泛:
ü ü ü
电路网络分析、交通运输、管理与线路的铺设 印刷电路板与集成电路的布线、社会网络、WEB链接图 工程进度的安排、课程表的制订、关系数据库的设计
2
7.1 图的定义和术语 一、图的结构定义:
q 图是由一个顶点集 V 和一个顶点间的关系集合弧集VR
(边的集合)构成的数据结构。
ü 可以用二元组定义为: Graph = (V, VR ) ü 其中,VR={<v,w>| v,w∈V 且 P(v,w)} ü 谓词 P(v,w) 定义了弧 <v,w>的意义或信息。
T5,T6不是有向树
22
● 有向图的生成树/生成森林:
含有图的全部顶点,但只有足以构成若干互不相交的有向树的弧。
A F
B E
G
C D
A F
B E
F1
C D
A
D B
F2

F E
C
A F
B E
T1
C D

D C B
T2
A E A F E
T3
D B C
F
23
图的抽象数据类型定义
q

数据结构严蔚敏7章图ppt课件

数据结构严蔚敏7章图ppt课件

InfoType *info;
}VNode,AdjList[MAX_V];
}ArcNode;
typedef struct //图的邻接表类型
{ AdjList vertices; //存储图中所有顶点的数组
int vexnum,arcnum; //存储图的顶点数目和边(弧)的数目
int kind; //图的种类标志
返回
表结点
adjvex nextarc info
表头结点
data firstarc
typedef struct ArcNode typedef struct
{ int adjvex;
{ VertexType data;
struct ArcNode *nextarc; ArcNode *firstarc;
}ArcCell,AdjMatrix[MAX_V][MAX_V];
typedef struct
{ VertexType vex[MAX_V]; //顶点信息数组(如顶点编号等)
AdjMatrix arcs;
//图的邻接矩阵
int vexnum,arcnum; //图的顶点数和边(弧)的数目
GraphKind kind;//图的种类标志
A CB F DE G (a) 有向图G1
A BC D EF (b) 无向图G2
返回
2 几个常用术语 可以证明,对于具有n个顶点的无向图的边和具有n个
顶点的有向图的弧的最大数目分别为n(n-1)/2和n(n-1)。 称具有n(n-1)/2条边的无向图为完全图(completed
grahp)。 称具有n(n-1)条弧的有向图为完全有向图 称边或弧的数目e<nlogn的图为稀疏图(sparse

课件c语言:数据结构第七章图

课件c语言:数据结构第七章图

含有 e=n(n-1) 条弧的有向图称作 有 向完全图;
若边或弧的个数 e<nlogn,则称作
稀疏图,
13
1
1
4
2
3
4
2
3
无向完全图 有向完全图
15 A 9
11
B 7 21
E
3
C2 F
权:与图的边或 弧相关的数。
网:带权的图。
有两个图G=(V,{E}) 和
图 G=(V,{E}),
245
无向完全图 5
3
6
1
3
6
图与子图 例

245
1 57
1
3
6
32
46
G2
顶点5的度:3 顶点2的度:4
G1
顶点2入度:1 出度:3 顶点4入度:1 出度:0

路径:1,2,3,5,6,3 路径长度:5
245
简单路径:1,2,3,5
回路:1,2,3,5,6,3,1
1
3
6
简单回路:3,5,6,3
G1
31.12.2020
h
6
7.1 图的定义和术语

7.2 图的存储结构(***)

7.3 图的遍历(***)
内 容
7.4 图的连通性问题 最小生成树(***)
7.5 有向无环图及其应用
拓扑排序 关键路径
7.6 最短路径
图的结构定义:
图是由一个顶点集 V 和一个弧集 R构成的 数据结构。
Graph = (V , R ) 其中,VR={<v,w>| v,w∈V 且 P(v,w)}
C D
E
A F

数据结构(C语言版) 第七章 图

数据结构(C语言版) 第七章 图

路径与连通性
路径、简单路径、回路(环)、简单回路
顶点之间的连通性、无向连通图、有向强连通

4/46
7.1 图的定义和术语(3)
路径与连通性
对于有向图G1
V1V3V4V1V2 是从V1 到V2 的路径, 不是简单路径;
V1V2是简单路径; V1V3V4V1V3V4V1是环,不是简单环; V1V3V4V1是简单环。
3/46
7.1 图的定义和术语(2)
有向图
弧<v,w> ∊ E (v,w ∊V),w为弧头, v为弧尾; 顶点v
邻接到顶点w,顶点w 邻接自顶点v,弧< v, w >和 顶点v、w相关联。
顶点v 的入度是以v 为弧头的弧的数目,记为ID(v); v 的出度是以v为弧尾的弧的数目,记为OD(v); v 的度是TD(v) = ID(v) + OD(v)。
}VNode, AdjList[MAX_VERTEX_NUM];
这种存储结构适合于进行first_adj(G,v) 找v的第一个邻接点的操作
邻接矩阵的方法适合存储稠密图
26/46
7.2.2 邻接表--- 链式存储结构
邻接表是一种顺序存储与链式结构相结 合的存储方式,类似于树的孩子链表。
对每个顶点建立一个单链表,第i个单链 表中的结点表示依附于顶点vi的边。
邻接矩阵
从邻接矩阵M中可以看出该图 共有( )个顶点;如果是有 向图该图共有( )条弧,如 果是无向图,则共有( )边。
AB CD
G
25/46
邻接矩阵存储的特点
无向图的邻接矩阵是对称的,对n个顶 点的无向图只需要存入下三角矩阵,即 需要n(n-1)/2个存储单元。
有向图的邻接矩阵所需要的存储单元不 一定,需要N*N个存储单元

数据结构第7章 图

数据结构第7章 图
typedef enum{DG,DN,UDG,UDN}GraphKind; /*定义顶点数据类型*/
typedef char VertexData; /*定义邻接矩阵中元素值(即边信息)的数据类型*/
typedef int ArcNode; /*定义图的邻接矩阵类型:一个顶点信息的一维数组,一个邻
接矩阵、当前图中包含的顶点数、边数以及图类型(有向图、 有向网、无向图、无向网)*/
输入<A,B>15,<A,C>6,<C,D>8,<D,A>10后,分别建立4 个边结点结点,存储这些边结点信息,然后将这些边结 点插入到相应的表结点链表中。可是关键的问题是如何 根据输入的边结点信息找到正确的链接位置?
利用一个定位函数(类似邻接数组的方法), LocateVertex(G,v)得到顶点v在表头结点数组中的 位置即可。
让我们来分析一下如何正确的使用邻接表存 第储一步一:个初图始。化。在该步骤中给出图的顶点数、边
(弧)数以及表头结点组。 例如对于下图,其初始的状态为:
G.vexnum=4;
G.arcnum=4; 0 A ^
1B ^
2C ^
3D ^
A 15 B
6
10
8
C
D
第二步:输入边结点信息,建立与各个表头结点邻接 的边结点链表。
typedef struct { VertexData vertex[MAX_VERTEX_NUM];
ArcNode arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int vertexnum,arcnum; GraphKind kind; } AdjMatrix;//图的邻接矩阵表示类型

数据结构第七章--图(严蔚敏版)

数据结构第七章--图(严蔚敏版)
9个顶点 个顶点
8个顶点的无向图最多有 条边且该图为连通图 个顶点的无向图最多有28条边且该图为连通图 个顶点的无向图最多有 连通无向图构成条件:边 顶点数 顶点数-1)/2 顶点数*(顶点数 连通无向图构成条件 边=顶点数 顶点数 顶点数>=1,所以该函数存在单调递增的单值反 顶点数 所以该函数存在单调递增的单值反 函数,所以边与顶点为增函数关系 所以28个条边 函数 所以边与顶点为增函数关系 所以 个条边 的连通无向图顶点数最少为8个 所以28条边的 的连通无向图顶点数最少为 个 所以 条边的 非连通无向图为9个 加入一个孤立点 加入一个孤立点) 非连通无向图为 个(加入一个孤立点
28
无向图的邻接矩阵为对称矩阵
2011-10-13
7.2
图的存储结构
Wij 若< vi,vj > 或<vj,v i > ∈E(G)
若G是网(有权图),邻接矩阵定义为 是网(有权图), ),邻接矩阵定义为
A [ i,j ] = , 0或 ∞
如图: 如图:
V1
若其它
V2
3 4
2
V3
2011-10-13
C
A
B
D 2011-10-13 (a )
3
Königsberg七桥问题
• Königsberg七桥问题就是说,能否从某点出发 通过每桥恰好一次回到原地?
C
C
A B

A D
B
D (a)
2011-10-13
(b)
4
第七章 图
7.1 图的定义 7.2 图的存储结构 7.3 图的遍历 7.4 图的连通性问题 7.5 有向无环图及其应用 7.6 最短路径
2011-10-13

数据结构(第7章图)

数据结构(第7章图)

图的表示方法
总结词
图可以用邻接矩阵或邻接表来表示。
详细描述
邻接矩阵是一种二维数组,其中行和列都对应于图的顶点,矩阵中的元素表示顶点之间的边。如果存在一条 从顶点i到顶点j的边,则矩阵中相应位置的值为1;否则为0。邻接表是一种链表结构,其中每个顶点都包含
一个链表,链表中的元素是与该顶点相邻的顶点。邻接表更节省空间,适用于稀疏图。
路线规划
图论用于构建和优化交通路网,提供最佳的出行路线建议。例如, Dijkstra算法和A*搜索算法可用于导航系统中的路径规划。
交通控制
通过图论,可以分析和优化交通信号灯的控制逻辑,以减少交通拥 堵和提高路网的运行效率。
物流配送
在物流和配送领域,图论用于优化车辆路径和货物配送计划,降低运 输成本和提高效率。
03
Prim算法
该算法从任意一个顶点开始,每次选择一条连接已选顶点和未选顶点的
权重最小的边,将其添加到最小生成树中,直到所有顶点都被选中。
最短路径问题的优化
Dijkstra算法
该算法用于求解单源最短路径问题,即从指定的源节点出发,找到到其他所有节点的最短路径。
Bellman-Ford算法
该算法用于求解带负权重的单源最短路径问题,即从指定的源节点出发,找到到其他所有节点的最短 路径,允许存在负权重的边。
连通度
连通度是衡量一个图连通性的度量,表示从一个顶点出发 可以到达图中其他连通图中,一棵包含图中所有顶点的树称为最小生成树,如果该树的边的权值和最 小。
最小生成树的性质
最小生成树具有一些重要的性质,如唯一性、最优性等。其中,唯一性是指在给定权值矩 阵下,最小生成树是唯一的;最优性是指最小生成树的权值和一定小于或等于其他任意一 棵树的权值和。

数据结构 (C语言版)课件:第7章_图

数据结构 (C语言版)课件:第7章_图
非简单图
2020/9/30
3
7.1 图的逻辑结构
7.1.1 图的定义
● 相关概念 无向图和有向图
● 无向图:如果图中顶点 vi 和 vj 之间的边无方向,则称这条边为无向边, 用无序偶对 (vi, vj) 表示,称该图为无向图。
● 有向图:如果图中顶点 vi 和 vj 之间的边有方向,则称这条边为有向边, 用有序偶对 <vi, vj> 表示,称该图为有向图。
无论有向图还是无向图,顶点数 n、边 数 e 和度数之间满足:
2020/9/30
8
7.1 图的逻辑结构
7.1.1 图的定义
● 相关概念 权和网
● 权:权通常是指对图中边赋予的有意义的数值量。在实际应用中,权 可以有具体的含义。
● 网:如果将图中的每条边上都赋上一个权值,则称这种图为网,或称 为有权图 。
2020/9/30
6
7.1 图的逻辑结构
7.1.1 图的定义
● 相关概念 稀疏图和稠密图
● 稀疏图:边数很少的图称为稀疏图,如果 e 表示图中的边数,n 表示 图中的顶点数,则 e<nlogn。
● 稠密图:边数很多的图称为稠密图,如果 e 表示图中的边数,n 表示 图中的顶点数,则 e≥nlogn。
2020/9/30
无向完全图
有向完全图
5
7.1 图的逻辑结构
7.1.1 图的定义
● 相关概念 邻接和依附
● 邻接:对图 G=(V, VR),如果边 (vi, vj)∈VR,则称顶点 vi 和 vj 互为邻 接点;如果弧<vi, vj>∈VR,则称顶点 vi 邻接到 vj,vj 邻接自 vi。
● 依附:对图 G=(V, VR),如果边 (vi, vj)∈VR 或弧 <vi, vj>∈VR,则称 边 (vi, vj) 或弧 <vi, vj> 依附于顶点 vi 和 vj。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。


简单路径(simple path) 路径长度(length)
7.1 图的基本概念(续)

回路(cycle,也称为环)

简单回路(simple cycle) 有向无环图(directed acyclic graph,简写 为DAG)

无环图(acyclic graph)

7.1 图的基本概念(续)

广度优先搜索树(breadth-first search tree)
7.4.2 广度优先搜索(续)
广度优先搜索的顺序是a,b,d,e,f,c,g
7.4.2 广度优先搜索(续)
//广度优先搜索算法的实现 void BFS(Graph& G, int V){ //初始化广度优先周游要用到的队列 using std::queue; queue<int> Q; //访问顶点V,并标记其标志位, V入队 G.Mark[V]= VISITED; Visit(G, V); Q.push(V); while(!Q.empty()) //如果队列仍然有元素
7.4.3 拓扑排序

7.4.2 广度优先搜索

广度优先搜索(breadth-first search,简称BFS)

它的基本思想是访问顶点V0, 然后访问V0邻接到的所有未被访问过的顶点V01,V02,…V0i, 再依次访问V01,V02,…V0i邻接到的所有未被访问的顶点, 如此进行下去,直到访问遍所有的顶点。
第七章

主要内容

7.1 7.2 7.3 7.4 7.5 7.6
图的基本概念 图的抽象数据类型 图的存储结构 图的周游(深度、广度、拓扑) 最短路径问题 最小支撑树
7.1 图的基本概念

习惯上,常用G=(V,E)代表一个图 。 顶点(vertex) 边(edge)
Leabharlann 7.3.1 图的相邻矩阵(adjacency matrix) 表示法 7.3.2 图的邻接表(adjacency list)表示 法

邻接多重表(adjacency multilist)表示法
7.3.1 图的相邻矩阵(adjacency matrix)表示法

相邻矩阵

表示顶点间相邻关系的矩阵。 若G是一个具有n个顶点的图,则G的相邻矩阵是如 下定义的nn矩阵: A[i,j]=1,若(V ,V )(或<V ,V >)是图G的边; A[i,j]=0,若(V ,V )(或<V ,V >)不是图G的边。
7.2 图的抽象数据类型(续)
//添加一条边 bool setEdge(int fromVertex,int toVertex,int weight);
//删一条边 bool delEdge(int fromVertex,int toVertex); //如果oneEdge是边则返回TRUE,否则返回FALSE bool IsEdge(Edge oneEdge);
强连通
7.1 图的基本概念(续)

连通分支或者连通分量(connected component)

无向图的最大连通子图。 强连通分支(强连通分量)。 带权的连通图。 不带有简单回路的无向图,它是连通的,并且具有|V|-1条 边。

网络


自由树(free tree)

7.2 图的抽象数据类型

深度优先搜索树(depth-first search tree)
7.4.1 深度优先搜索(续)
深度优先搜索的顺序是a,b,c,f,d,e,g
7.4.1 深度优先搜索(续)
void DFS(Graph& G, int V){ //深度优先搜索算法实现 G.Mark[V]= VISITED; //访问顶点V,并标记其标志位 PreVisit(G, V); //访问V for(Edge e=G. FirstEdge(V); G.IsEdge(e); e=G. NextEdge(e)) //访问V邻接到的未被访问过的顶点,并递归地按照 //深度优先的方式进行周游 if(G.Mark[G. ToVertices(e)]== UNVISITED) DFS(G, G. ToVertices(e)); PostVisit(G, V); //访问V }

从一顶点出发,可能不能到达所有其它的顶点,如非连通图; 也有可能会陷入死循环,如存在回路的图。 为图的每个顶点保留一个标志位(mark bit); 算法开始时,所有顶点的标志位置零; 在周游的过程中,当某个顶点被访问时,其标志位就被标记为已 访问。

解决办法

7.4 图的周游(续)
//图的周游算法的实现 void graph_traverse(Graph& G){ //对图所有顶点的标志位进行初始化 for(int i=0;i<G.VerticesNum();i++) G.Mark[i]=UNVISITED; //检查图的所有顶点是否被标记过,如果未被标记, //则从该未被标记的顶点开始继续周游 //do_traverse函数用深度优先或者广度优先 for(int i=0;i<G.VerticesNum();i++) if(G.Mark[i]== UNVISITED) do_traverse(G, i);
i j i j i j i j

相邻矩阵的空间代价为O(n2)
6.3.1 图的相邻矩阵(adjacency matrix)表示法(续)
0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0
A7=
7.3.1 图的相邻矩阵(adjacency matrix)表示法(续)
7.4.1 深度优先搜索(续)

深度优先搜索算法的时间复杂度
DFS对每一条边处理一次(无向图的每条边从两个方向处理),每 个顶点访问一次。 采用邻接表表示时,有向图总代价为Θ(|V|+|E|),无向图为 Θ(|V|+2|E|) 2 采用相邻矩阵表示时,处理所有的边需要Θ(|V| )的时间 ,所 以总代价为Θ(|V|+|V|2)= Θ(|V|2)。

7.1 图的基本概念(续)
无向图示例
有向图示例
7.1 图的基本概念(续)

标号图(labeled graph) 带权图(weighted graph)
7.1 图的基本概念(续)

顶点的度(degree)

与该顶点相关联的边的数目。 入度(in degree) 出度(out degree) 图G=(V,E),G’=(V’,E’)中,若V’≤V,E’≤E,并且E’中 的边所关联的顶点都在V’中,则称图G’是图G的子图
在以处理图的边为主,要求每条边处理一次的实际应 用中特别有用。
邻接多重表(adjacency multilist)
G6的邻接多重表表示
有向图邻接多重表(adjacency multilist)

在顶点表中设计两个指针

第一个指向以此顶点为始点的第一条边 第二个指向以此顶点为终点的第一条边 第一个指针指向始点与本边始点相同的下一条边 第二个指针指向终点与本边终点相同的下一条边
7.4.2 广度优先搜索(续)
{
int V=Q.front(); //顶部元素 Q.pop(); //出队
//将与该点相邻的每一个未访问点都入队 for(Edge e=G.FirstEdge(V); G.IsEdge(e);e=G.NextEdge(e)) { if(G.Mark[G.ToVertex(e)]== UNVISITED)
}
7.4 图的周游(续)

图的生成树

图的所有顶点加上周游过程中经过的边所构 成的子图称作图的生成树。

图的生成森林。
7.4.1 深度优先搜索

深度优先搜索(depth-first search,简称DFS)基本思想


访问一个顶点V,然后访问该顶点邻接到的未被访问过的顶点V’, 再从V’出发递归地按照深度优先的方式周游, 当遇到一个所有邻接于它的顶点都被访问过了的顶点U时,则回到已 访问顶点序列中最后一个拥有未被访问的相邻顶点的顶点W, 再从W出发递归地按照深度优先的方式周游, 最后,当任何已被访问过的顶点都没有未被访问的相邻顶点时,则 周游结束。
A4=
0 3 0 15
3 0 4 0
0 4 0 6
15 0 6 0
7.3.2 图的邻接表(adjacency list)表示法
7.3.2 图的邻接表(adjacency list) 表示法(续)
G6邻接表表示
7.3.2 图的邻接表(adjacency list) 表示法(续)
7.2 图的抽象数据类型(续)
//返回边oneEdge的始点 int FromVertex(Edge oneEdge);
//返回边oneEdge的终点 int ToVertex(Edge oneEdge); //返回边oneEdge的权 int Weight(Edge oneEdge); };
7.3 图的存储结构

边表


故仅用表中第一个链便得到有向图的出边表,仅用第二 个链便得到有向图的入边表
邻接多重表(adjacency multilist)
(续)
G7的邻接多重表表示
7.3.2 图的邻接表(adjacency list) 表示法(续)

n个顶点m条边的无向图

需用(n+2m)个存储单元 需用(n+m)个存储单元
边的始点 边的终点
相关文档
最新文档