7图
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图的存贮结构__邻接表
表结点
adjvex nextarc info
#define MAX_VERTEX_NUM // 定义表结点 typedef struct ArcNode { int adjvex; Struct ArcNode *nextarc; InfoType *info; }ArcNode;
图的存贮结构__邻接表
V1 V2 V4 V3 V2 V1 ∧ 1 2 ∧ 0 3 ∧ ∧
V3
V4
对于无向图,第i个顶点的度为第i个链表的结点数 对于有向图 第i个链表的结点数是第i个顶点的出度 如何求入度?遍历
图的存贮结构__逆邻接表
若问题总对入度更关心,则可以把线性链表的表结点 的数据域更改即可:由表尾改为表头:所有以头结点 为表头的弧组成的线性链表。 此时该邻接表称为逆邻接表。
V2 V4 2 ∧
V1
V3 V2 V1 V3 V4
0 0 3
∧ ∧
∧
图的存贮结构__十字链表
为了同时表示一个顶点和其他顶点的所有关系:出度 和入度,可以把邻接表和逆邻接表结合起来得到一种 表:十字链表(Orthogonal List)。
是有向图的一种存贮方式
图的存贮结构__十字链表
弧结点
tailvex headvex hlink tlink info
图的存贮结构__十字链表
V4 3 1∧ 3 2 ∧∧ 2 3 ∧∧ ∧ 0 1∧ 0 2 ∧
V3
V2 V1 V1 V2
V3
V4
图的存贮结构__十字链表
#define MAX_VERTEX_NUM // 定义弧结点 typedef struct ArcBox { int tailvex, headvex; // struct ArcBox *hlink; // struct ArcBox *tling; // InfoType *info; // }ArcBox; 20
定义和术语:完全图etc.
对于有n个顶点的无向图,边或弧e的取值范围 是0到(1/2)n(n-1)。有(1/2)n(n-1)条边的无向 图称为完全图(Completed graph) 对于有n个顶点有向图,e的取值范围是 0到 n(n-1)。有n(n-1)条弧的有向图称为有向完全 图 有很少条边或弧(如<nlogn)的图称为稀疏图 (Sparse graph) , 反 之 称 为 , 稠 密 图 (Dense graph)
V3 V4 V5
对于无向图: 矩阵一定是一个对称阵 行(列)非零个数,表示度
图的存贮结构__数组表示
#define INFINITY INT_MAX #define MAX_VERTEX_NUM 20 // 定义图的类型 typedef enum { DG, // 有向图, 0 DN, // 有向网, 1 AG, // 无向图, 2 AN // 无向网, 3 }GraphKind;
定义和术语:回路
第一个顶点和最后一个顶点相同的路径 称为回路或环(Cycle)。 序列中顶点不重复的出现的路径称为简 单路径。 除第一个顶点和最后一个顶点外,其余 顶点不重复出现的回路,称为简单回路 或简单环。
定义和术语:无向图连通
在无向图G中,如果从顶点v到顶点v'有 路径,则称v和v'是连通的。 如果对于图中任意两个顶点vi,vj和都是连 通的,则称G是连通图(Connected Graph) 所谓连通分量(Connected Component)是 指无向图中的极大连通子图。
定义和术语:路径
无向图G(V,{E})中从顶点v到顶点v‘的路 径 (Path) 是 一 个 顶 点 序 列 (v=vi,0,vi,1,…,vi,m=v’),其中(vij-1, vi,j) ∈E,1≤j≤m。i = 1, 2, …, k,表示v到v’ 间有k条路径。 如果G是有向图,则路径也是有向的,顶 点序列应满足<vi,j-1, vi,j>∈E, 1≤j≤m。 路径的长度是路径上的边或弧的数目。
定义和术语:生成森林
如果一个有向图恰有一个顶点的入度为0, 其余顶点的入度均为1,则是一棵有向树。 一个有向图的生成森林由若干棵有向树 组成,含有图中全部顶点,但只有足以 构成若干棵不相交的有向树的弧。
图的存贮结构__数组表示
一种数据结构的存贮表示,既要表示数据元素 (值),又要表示数据元素之间的关系; 图的任意两个结点(顶点)之间都可能有关系, 因此用矩阵来表示,称为邻接矩阵; 矩阵中数据aij = 0表示vi和vj没有关系,即vi和 vj不邻接(或没有vi邻接到vj) 对于网,可以用aij表示权。若vi和vj不邻接 (或没有vi邻接到vj),则可以用无限大∞表 示权。
定义和术语:度
无向图:
顶点v的度(Dgeree)是和v相关联的边的数目, 记为TD(V)。 以顶点v为头的弧的数目称为v的入度 (InDegree),记为ID(v) 以v为尾的弧的数目称为v的出度 (OutDegree),记为OD(v) 顶点v的度TD(v)=ID(v)+OD(v)
有向图:
弧头和弧尾顶点的位置 弧头相同的弧的链域; 弧尾相同的弧的链域; 弧的相关信息的指针
图的存贮结构__十字链表
// 定义头结点 typedef struct VexNode { VertexType data; // 数据元素 ArcBox *firstin, *firstout; // 该顶点的第一条入弧和出弧 }VexNode; // 十字链表定义 typedef struct { VexNode xlist[MAX_VERTEX_NUM]; int vexnum, arcnum; }OLGraph;
定义和术语:邻接
对于无向图G=(V,{E}),如果边(v,v‘)∈E, 则称顶点v和v'互为邻接点(Adjacent),即 v和v'相邻接。 边(v,v‘)依附(Incident)于顶点v和v’或者 说(v,v‘)和顶点v和v'相关联。 对 于 有 向 图 G=(V,{A})) , 如 果 弧 <v,v’>∈A,则称顶点v邻接到顶点v’, 顶点v’邻接自顶点v,弧<v,v’>和顶点 v,v’相关联。
tailvex / headvex: 尾/头域:弧尾和弧头两个顶点在图中的位置 hlink: 弧头相同的下一条弧 tlink: 弧尾相同的下一条弧 info: 该弧的相关信息
图的存贮结构__十字链表
顶点结点 data firstin: firstout: firstin firstout
顶点为弧头的第一个弧结点; 顶点为弧尾的第一个弧结点;
图的存贮结构__数组表示
// 邻接矩阵 typedef struct ArcCell { VRType adj;
// 顶点之间的关系的类型,对于无 // 权图,1或0表示是否相邻,对于 // 网,则为权值的类型。 InfoType *pInfo; // 与该弧相关的信息的指针 }ArcCell, AdjMatrax[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
第七章 图
图
V1 V2 V1 V2
V3
V3
V4
V4
V5
结点之间的关系:多对多,任两个结点之间 都可能有关系存在_图
定义和术语:有向图
顶点(Vertex):在图中的数据 元素。 V是顶点的有穷非空集合;VR 是两个顶点之间的关系的集 合 , 若 〈v,w〉∈VR , 则 〈v,w〉表示从v到w的一条弧 (Arc),称v 为弧尾(Tail)或初 始点(Initial node),w为弧头 (Head) 或 终 端 点 (Terminal node), 此时的图称为有向图。 表示为:G=(V,{A})
图的存贮结构__数组表示
typedef struct { VertexType AdjMatrix int GraphKind }Mgraph;
vexs[MAX_VERTEX_NUM]; arcs; vexnum, arcnum; kБайду номын сангаасnd; // // // //
顶点向量 邻接矩阵 顶点数和弧数 图的类型
FirstAdjVex( G, v ); // 返回v的第一个邻接顶点 NextAdjVex( G, v, w ); // 返回v的相对于w的下一个邻接点 InsertVex( &G, v ); // 插入顶点v DeleteVex( &G, v ); // 删除顶点v InsertArc( &G, v, w ); // 新增弧 DeleteArc( &G, v, w ); // 删除弧 DFSTraverse( G, v, visit( ) ); // 深度优先遍历 BFSTraverse( G, v, visit( ) ); // 广度优先遍历 }// ADT Graph
图的存贮结构__邻接表
数组表示法着眼于顶点之间的关系; 类似于树的孩子表示法,如果能把图中任一个 顶点的所有邻接点都表示出来,也就可以表示 图。 邻接表。方法:
顶点的邻结点构成一个线性链表,链表结点的数据 域存放该邻接点在图中的位置。 该线性链表设置头结点,数据域存放数据元素,指 针指向该结点的邻结点构成线性链表; 所有的顶点的头结点用一个数组表示。则线性链表 中的数据域可以存放邻结点在该树组中的位置。
头结点
data
20
firstarc
// 弧指向的顶点的位置 // 下一条弧 // 该弧相关信息的指针
图的存贮结构__邻接表
// 定义头结点 typedef struct VNode { VertexType data; // 顶点数据元素 ArcNode *pFirstarc; // 第一条弧结点 }VNode, AdjList[MAX_VERTEX_NUM]; // 邻接表 typedef struct { AdjList vertices; // 顶点数组 int vexnum, arcnum; GraphKind kind; // 图的类型 }ALGraph;
定义和术语:权,网与子图
有时图的边或弧具有与它相关的数,这 种与图的边或弧相关的数叫做权。 这些权可以表示从一个顶点到另一个顶 点的距离或耗费。这种带权的图通常称 为网(Network)。 假设有两个图G = ( V , { E } ) 和 G’ = ( V’ , { E’ } ),如果V’属于V且 E’属于E,则称G’为G的子图(Subgraph)
V1
V2
V3
V4
定义和术语:无向图
若 〈v,w〉∈VR 必 有 〈w,v〉∈VR,即VR是 对称的,则以无序对 (v,w) 对 代 替 这 两 个 有 序对,表示v和w之间 的一条边(Edge),此时 的 图 称 为 无 向 图 (Undigraph)。 表示:G=(V,{E})
V1
V2
V3
V4
V5
ADT Graph
ADT Graph { 数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。 数据关系R:R={VR} VR={<v,w>|v,w∈V,且P(v,w), <v,w>表示从v到w 的弧,P(v,w)定义了弧<v,w>的意义或信息} 基本操作P: CreateGraph( &G, V, VR ); // 构造图 DestroyGraph( &G ); // 销毁图 LocateVex( G, u ); // 寻找u的位置 GetVex( G, v ); // 返回v的值 PutVex( &G, v, value ); // 对v赋值
定义和术语:有向图连通
有向图G中,如果对于每一对vi,vj∈V, vi≠vj,从vi到vj和从vj到vi都存在路径,则 称G是强连通图。 有向图中的极大强连通子图称作有向图 的强连通分量。
定义和术语:生成树
一个连通图的生成树是一个极小连通子 图,它含有图中全部顶点,但只有足以 构成一棵树的n-1条边。 一棵有n个顶点的生成树有且仅有n-1条 边。
图的存贮结构__数组表示
0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0
V1 V2
V3
V4
有向图: 行非零个数,表示出度OD 列非零个数,表示入度ID
图的存贮结构__数组表示
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
V1 V2