数据结构-图(1)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
带权无向图的例子
第7章 图
V0
V1
V0
V1
路径与回路
V2
V3
V4
(a)
V2
V3
(b)
无 向 图 G=(V,{E}) 中 从 顶 点 v 到 v’ 的 路 径 是 一 个 顶 点 序 列
(v=vi0,vi1,vi2,…,vin=v’)其中(vij-1, vij)∈E, 1≤j≤n。如果图G是有向图, 则路径也是有向的,顶点序列应满足<vij-1, vij>∈E, 1≤j≤n。
wij , 若(vi , v j )或
,
其它
vi , v j
V
第7章 图
第7章 图
第7章 图
邻接矩阵表示法类型描述 :
#define MAX_VERTEX_NUM 20 #define INFINITY INT_MAX
//最多顶点个数 //表示极大值∞
typedef enum{DG, DN, UDG, UDN} GraphKind; // 有向图,有向网,无向图,无向网
第7章 图
第7章 图
邻接表存储结构的类型定义:
typedef struct ArcNode{//表结点结构类型
int adjvex;
//该弧(边)的终点位置
struct ArcNode *nextarc; //指向下一条弧的指针
InfoType info;
//该弧的相关信息,如权重
} ArcNode;
a
b
c
i
d
e
f gh
第7章 图 上堂课内容回顾
森林转换为二叉树:将森林中的每棵树转换成相应的二叉树, 形成若干个二叉树的森林;第一棵二叉树不动,从第二棵二 叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树 根结点的右孩子, 当所有二叉树连在一起后,所得到的二叉 树就是由森林转换得到的二叉树。
二叉树还原为森林:将二叉树中根结点与其右孩子连线,及 沿右分支搜索到的所有右孩子间连线全部抹掉,使之变成一组 孤立的二叉树;将孤立的二叉树依次还原成树
度与边的关系如下:
n
Why?
TD(vi )
e i1 2
一个边被两个顶点分,
对于度来说有两次贡献
第7章 图 权与网
在实际应用中,有时图的边或弧上往往与具有一定意义的 数有关,即每一条边都有与它相关的数,称为权,这些权可 以表示从一个顶点到另一个顶点的距离或耗费等信息。我们 将这种带权的图叫做赋权图或网。
e<n-1 → 非连通图 e>n-1 → 一定有回路 e=n-1 → 不一定都是图的生成树
第7章 图
例1:G是非连通无向图,共28条边,至少有多少个顶点?(注 意审题)
答案:9个顶点
例2:有n个顶点的有向强连通图最多需要多少条边?最少需要 多少条边?
答案:有n个顶点的有向强连通图最多有n(n-1)条边(构成 一个有向完全图的情况);最少有n条边(n个顶点依次首尾相接 构成一个环的情况)。
向图中代表边的无序顶点对,通常用圆括号括起来,用以表示一
条无向边。 如:(vi,vj)
Vi
Vj
如果表示边的顶点对是有序的,则称G为有向图,在有向图中
代表边的顶点对,通常用尖括号括起来 (称为弧)。如: <vi,vj >
弧尾 Vi
Vj 弧头
第7章 图 有向图、无向图示例
第7章 图
本章不予讨论的图
第7章 图 Internet 网分布图 蛋白质相互作用图
第7章 图
7.3 图 的 遍 历
图遍历的概念:从给定图中任意指定的顶点(称为初始点)出发,按照某种 搜源自文库方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这 个过程称为图的遍历。
对于图遍历,需注意以下两点: 如果给定图是连通的无向图或者是强连通的有向图,则遍历过程 一次就能完成,并可按访问的先后顺序得到由该图所有顶点组成 的一个序列。 为避免同一顶点被访问多次,设一个辅助数组visited[0..n-1], 它的初始值置为0,一旦访问了顶点vi,便置visited[i]为1或者为 被访问时的次序号
双亲只管长子 长子连接兄弟
指向左孩子
指向右兄弟
第7章 图 上堂课内容回顾
树和二叉树之间的转换:
根结点肯定没有右孩子!
方法:加线—抹线—旋转
兄弟相连
长兄为父 a
b
c
i
d
e
f
g
h
孩子靠左
a
b
d
c
e
i
f g h
第7章 图 上堂课内容回顾
二叉树还原为树 要点:把所有右孩子变为兄弟!
a
b
d
c
e
i
f g h
//图中顶点数n和边数e
int kind;
//图的类型
} ALGraph;
第7章 图
邻接表的特点如下:
邻接表表示不惟一。这是因为在每个顶点对应的单链表中,各 边结点的链接次序可以是任意的,取决于建立邻接表的算法以 及边的输入次序。
对于有n个顶点和e条边的无向图,其邻接表有n个头结点和2e个 表结点。显然,在总的边数小于n(n-1)/2的情况下,邻接表比邻 接矩阵要节省空间。
第7章 图 上堂课内容回顾
树的遍历: 先根遍历—等同于转换的二叉树进行先序遍历 后根遍历---等同于转换的二叉树进行中序遍历
森林的遍历: 先序遍历—等同于转换的二叉树进行先序遍历 中序遍历—等同于转换的二叉树进行中序遍历
第7章 图 上堂课内容回顾
哈夫曼树(Huffman)树是一类带权路径长度(WPL)最短的树
第7章 图
连通图: 无向图中任意两个顶点都连通
连通分量:无向图中的极大连通子图。
强连通图: 有向图每对顶点之间都存在路径
强连通分量: 有向图的极大强连通子图。
V0
V1
V2
V3
V4
连通图
V0
V1
V2
V3
V4
非连通图
V0
V1
V3
V4
强连通图
V0
V1
V3
V4
非强连通图
第7章 图
生成树: 连通图的生成树是一个极小连通子图,它含有图 中全部顶点,但只有足以构成一棵树的n-1条边。
3
0 (c)
(vj)的是的入边邻接点;
4
第7章 图
顶点的度、入度和出度
在无向图中,顶点所具有的边的数目称为该顶点的度。
在有向图中,以顶点v为头的弧的数目,称为该顶点的入度。 以顶点v为尾的弧的数目,称为该顶点的出度。一个顶点的 入度与出度的和为该顶点的度。
一般地,若图G中有n个顶点,e条边或弧,则图中顶点的
3) 从F中删除这两棵二叉树,同时将新二叉树加入到F中; 4) 重复2)-3)步直到F中只含一棵二叉树为止,这棵二叉树
就是Huffman 树。
第7章 图
第7章 图
7.1 图的定义与基本术语 7.2 图的存储结构 7.3 图的遍历 7.4 图的应用
--最小生成树 (无向图) --拓扑排序 (有向图,简介) --最短路径 (无向图)
第7章 图
7.1 图的定义和术语
1. 图的定义
图(Graph)G由两个集合V(Vertex)和E(Edge)组成, 记为 G=(V,{E}),其中V是顶点的有限集合, 记为V(G), E是连接V中两个 不同顶点(顶点对)的边的有限集合, 记为E(G)。
在图G中,如果代表边的顶点对是无序的,则称G为无向图,无
构造 Huffman树算法
1) 以权值分别为W1,W2...Wn的n各结点,构成n棵 二叉树T1,T2,...Tn并组成森林F={T1,T2,...Tn}, 其中每棵二叉树 Ti仅有一个权值为 Wi的根结点;
2) 在F中选取两棵根结点权值最小的树作为左右子树构造 一棵新二叉树,并且置新二叉树根结点权值为左右子树 上根结点的权值之和;
对于无向图,邻接表的顶点vi对应的第i个链表的表结点数目正 好是顶点vi的度。
对于有向图,邻接表的顶点vi对应的第i个链表的表结点数目仅 仅是vi的出度(求顶点的出度易,求入度难)。其入度为邻接表 中所有adjvex域值为i的表结点数目。(逆邻接表)
第7章 图 图G1的逆邻接表表示法
3. 十字链表 (课后自学) 4. 邻接多重表 (课后自学)
第7章 图
1
子图
2
3
0 (a)
有两个图G=(V, {E})和图G’=(V’, {E’}),
4
若V’ V且E’E, 则称图G’为G的子图。
1
邻接点 :边的两个顶点对 (vi,vj) 和 <vi,vj >
2
3
0 (b)
无向图:vi和vj互为邻接点;
4
1
有向图:vi和vj互为邻接点,弧顶(vj)是
弧尾(vi)的出边邻接点,弧尾(vi)是弧顶 2
的结构如下:
表头结点 data firstarc
表结点 adjvex nextarc info
data存储顶点vi的名称或其他信息; firstarc指向链表中第一 个结点。
adjvex指示与顶点vi邻接的点在图中的位置;nextarc指示下 一条边或弧的结点; info存储与边或弧相关的信息,如权值等。
第7章 图
第七章 图
电子科技大学
第7章 图 上堂课内容回顾
树的存储结构: 双亲表示法 孩子表示法 孩子兄弟表示法
思路:用二叉链表来表示树,但链表中的两个指针域含义不同。 左指针指向该结点的第一个孩子; 右指针指向该结点的下一个兄弟结点。
firstChild data
nextSibling
typedef struct ArcCell{// 弧的定义 VRType adj; //VRType是顶点关系类型。对无权图,用1或0表示是否相邻; //对带权图,则为权值 InfoType *info; //该弧的相关信息指针,一般不需要
} ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //每个元素为ArcCell结构的二维数组(邻接矩阵),表示了边的信息
第7章 图
7.2 图的存储结构
1. 邻接矩阵表示法(数组表示法)
图G是一个具有n个顶点的无权图,G的邻接矩阵是具有如下
性质的n×n矩阵A:
A[i,
j]
1, 0,
若(vi , v j )或 其它
vi , v j
V
若图G是一个有n个顶点的网,则它的邻接矩阵是具有如下性 质的n×n矩阵A:
A[i,
j]
根据搜索方法的不同,图的遍历方法有两种:
深度优先搜索法DFS(Depth-First Search) 广度优先搜索法BFS (Breadth-First Search)
局限性:用邻接矩阵方法存储图,容易确定图中任意两个顶点之间是 否有边相连。但是,要确定图中有多少条边,则必须按行、按列对每 个元素进行检测,所花费的时间代价很大。
第7章 图
2.邻接表存储方法:图的链式存储结构
在邻接表中,对图中每个顶点建立一个单链表,第i个单链
表中的结点表示依附于顶点vi的边(对有向图是以顶点vi为尾 的弧)。每个单链表上附设一个表头结点。表结点和表头结点
typedef struct{// 图的定义 VertexType vexs[MAX_VERTEX_NUM]; //顶点向量 AdjMatrix arcs; //邻接矩阵 int vexnum, arcnum; //图的顶点数和弧数 GraphKind kind; //图的种类标志,共四种
} MGraph;
typedef struct Vnode {//头结点的类型
Vertex data;
//顶点信息
ArcNode *firstarc;
//指向第一条弧
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {//邻接表
AdjList vertices;
int vexnum, arcnum;
第7章 图
邻接矩阵的特点如下:
图的邻接矩阵表示是惟一的。
无向图的邻接矩阵一定是一个对称矩阵。存储可采用压缩存储。
弱邻接矩阵是一个稀疏矩阵,可以采用三元组表的方法存储邻接矩阵。
计算度容易:对于无向图,邻接矩阵的第i行(或第i列)非零元素(或 非∞元素)的个数正好是第i个顶点vi的度。对于有向图,邻接矩阵的 第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点vi的 出度(或入度)。
脑网络图
第7章 图
2. 基本术语
完全图(边达到最大)、稀疏图与稠密图 n:图中顶点的个数; e:图中边或弧的数目。
无向图其边数e的取值范围是0~n(n-1)/2。 无向完全图:有n(n-1)/2条边的无向图。
有向图其边数e的取值范围是0~n(n-1)。 有向完全图:有n(n-1)条边的有向图。
稀疏图:对于有很少条边或弧的图(e<nlogn), 反之称为稠密图。
路径的长度: 路径上经过的弧或边的数目;
回路或环: 第一个顶点和最后一个顶点相同时;
简单路径:表示路径的顶点序列中的顶点各不相同;
简单回路:除了第一个和最后一个顶点外,其余各顶点均不
重复出现的回路。
例4:在图a中,V0,V1,V2,V3 是简单路径; V0,V1,V2,V4,V1不是简 单路径;在图b中, V0,V2,V3,V0是简单回路,也是一个环。
相关文档
最新文档