7第七章 图 (Graph)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2 3 2 2
4 4
1)求顶点v的度:等于v对应线性链表的长度; 2)判断两顶点是否邻接:要看v对应线性链表中 有无对应的结点 3)在图中增加、删除边:在相应的顶点的链表 中插入、删除结点 4)检测图中的总边数:
无向图的邻接表的特点
1)在G邻接表中,同一条边对应两个结点; 2)设存储顶点的一维数组大小为m(m图的顶点数n), 图 的边数为e,G占用存储空间为:m+2*e。G占用存储空间 与 G 的顶点数、边数均有关;适用于边稀疏的图
0 1 2 3
V0 V1 V2 V3
3 0 0 2
V0
V1
V2
V3
m-1
3.邻接表存储下图的有关操作
1)求顶点v的度: 2)判断两顶点是否邻接: 3)在图中增加、删除边: 4)检测图中的总边数:
V0 V2 V3 V4 V1 0 1 2 3 4 m-1 V0 V1 V2 V3 V4 1 3
0 1
0
1
(b)
连通图、强连通图
在无(有)向图G=< V, E >中,若对任何两个顶
点 v、u 都存在从v 到 u 的路径,则称G是连通 图 对有向图而言,称强连通图
连 通 图 V0 V1
V0
V1 V4
V2 V5 V1
V2
V3
V0
V4
V1
V3 V0
非 连 通 图 非 强 连 通 图
强 连 通 图
接的有向图。
V0 V2 V3
在一个含有n个顶点的有向完全图中,有n(n-1)条弧。
V1
V0
V1
V4
V2
V3

邻接点:边的两个顶点 关联边:若边e= (v, u), 则称顶点v、u 关联边 顶点的度 在无向图中,顶点V的度 = 与V相关联的 边的数目,记作TD(V) 在有向图中,顶点V的度= V的出度+V的入 度 顶点V的出度=以V为起点有向边数 顶点V的入度=以V为终点有向边数
V0 V2
V1
V0
V1
V3
V4
V2
V3
顶点 度 V0 2 V1 V2 V3 3 3 2
顶点 入度 出度 度 V0 1 2 3
V1 V2 V3
1 1 1
0 1 1
1 2 2
V4
2



路径 G中的顶点序列v1,v2,… ,vk,若各边(vi,vi+1)E, 则 称该序列是从顶点v1到顶点vk的路径; 回路: 若路径的顶点和终点相同,则称回路。 简单路径 在一条路径中,若除起点和终点外,所有顶点各不相同, 则该路径为简单路径; 简单回路: 由简单路径组成的回路称为简单回路; V0 V1 V0
V0 V1 V2 V3 V4
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
V0
V1
V0 V1 V2 V3
V2
V3
0 0 0 1
1 0 0 0
1 0 0 0
0 0 1 0
4.邻接矩阵的C语言描述
#define N 5/*顶点数*/ #define M 6 /*边数*/ typedef char vextype; /*顶点类型*/ typedef sturct{ vextype vexs[N]; /*存顶点的数组*/ adjtype edge[N][M];/*存边信息的矩阵 */ V0 V1 V2 V3 V4 0 1 0 1 0 }
V0 V1 V2 V3 V4
V0 V2
V1
V3
V4
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0 1 0 1 1 1 0 0 1 0 0
邻接矩阵表示法的空间代价 只与图的顶点数有关
3.邻接矩阵下图的有关操作
1)求顶点v的度: 2)判断两顶点是否邻接: 3)在图中增加、删除边: 4)检测图中的总边数:

时间复杂度O(n+e)
typedef struct node //定义 边结点 { char adjver struct node *next; }edgenode; typedef struct { //定义 顶点 char vertex; edgenode *link; }vernode; typedef struct {//定义 图 vernode adjlist[MAX]; int n,e; //n-顶点数,e-边数 }link_graph; link_graph *ga;
0 1 2 3 4 m-1
V0 V1 V2 V3 V4
1 0 1
3 2 3 2 2 4 4
0 1
函数:
int create(link_graph *ga ) { NODE *p;
int n, e, i;char v1, v2;
scanf(“%d%d\n”, &n,&e); //读入顶点数、边数 ga->n=n, ga->e=e; for(i=0; i<n; i++) //建立顶点数组 { scanf(“%c”, &ga->adjlist[i].vertex); //读入顶点数据
V2
V3
V2
V3
连通分图(有向图中为强连通分量)
无向图G 的极大连通子图称为G的连通分量
极大连通子图意思是:该子图是 G 连通子图
,将G 的任何不在该子图中的顶点加入,子 图不再连通;
连通分图
非 连 通 图 V0 V3 V1 V2 V4 V5
有向图D 的极大强连通子图称为D 的强连通分量
V0 V2 V3
V1
V0 V2
V1
V0
V3
V4 V2
V1
V4
V4
V3
连通图 G1
G1的生成树
边的权:在图的边或弧上表示数字,表示与该边
相关的数据信息,这个数据信息就称该边的权( weight)。 网(network):边(或弧)上带权的图称为网。
V0
8
6 V2
V1 3 V4
2 4
V3
5
7.2图的存储表示
V0
V2 V3
V1
V0
V1
V4
V2
V3
图的存储结构要保存两类信息: 1)顶点的数据 V0 V1 V2 V3 2)顶点间的关系
V4
邻接矩阵表示法
邻接表表示法
7.2.1. 邻接矩阵(数组)表示
1.图的邻接矩阵 图G的邻接矩阵是满足如下条件:
A[i][j]= 1 0 若(vi,vi+1)E 或 <vi,vi+1>E V0 否则
typedef struct {//定义 图
vernode adjlist[MAX]; int n,e; //n-顶点数,e-边数 }link_graph;
思想:如何给存储结构赋值
5.建立无向邻接表
1. 建立顶点数组。读入各顶点数据vextex,将link域赋Null。 2. 建立各顶点的邻接表。 读入顶点对<i,j>, 生成两个节点 , i j 分别插入顶点j,i的邻接表的头部。直至处理完所有的边。
V0 V2 V1
V3
V4
1 0 1 0 1 0 1 0 1 1 1 0 1 0 0 0 1 1 0 0
5.建立无向图的邻接矩阵
算法思想:
1)给存顶点的一维数组赋值; 2)初始化存边的二维数组; 3)依次读入顶点对,给二维数组相关的元素赋值。
代码见书P162,函数Creat_graph( ) 时间复杂度O(n+n2+e)
V0 V1 V2 V3 V4
V1
V0 V2 V3
V1
V4
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
V2
0 0 0 1 1 0 0 0
V3
1 0 0 0 0 1 0 0
V0 V1 V2 V3
2.无向图邻接矩阵表示的特点: 1)无向图邻接矩阵是对称矩阵,可考虑矩阵的压缩 存储 2)G占用存储空间只与它的顶点数有关,与边数无 关;适用于边稠密的图;
V1
V2
V3 V4 V2 V3
子图
设有两个图G=(V,E)、G1=(V1,E1)
,若V1 V,E1 E,E1关联的顶点都在 V1中,则称 G1是G的子图;
(b)、(c) 是 (a) 的子图
V0 V1 V0 V2 V4 V3 V4 V3 (c) V1 V0 V1

V2
V3
V2
V4
(a)
V0 V1 V2 V3 V4
V0 V2 V3
V1
V4
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
V0
V1
V0 V1 V2 V3
V2
V3
0 0 0 1
1 0 0 0
1 0 0 0
0 0 1 0
邻接矩阵存储下图的有关操作
1)求顶点v的度:等于二维数组对应行(或列)中1的个数; 2)判断两顶点是否邻接:只需判二维数组对应分量是否为1; 3)在图中增加、删除边:只需对二维数组对应分量赋值1或清0; 4)检测图中的总边数:扫描整个数组A,统计出数组中非0元素的 个数。无向图的总边数为非0元素个数的一半,而有向图的总弧 数为非0元素个数; V0 V2 V3 V4 V1
第七章
图 (Graph)
主要内容
7.1 图的基本概念
7.2 7.3 7.4 图的存储结构 图的遍历 生成树和最小生成树
7.1 图的基本概念
1. 图的定义
• 图G由两个集合构成,记作G=<V,E> 其中: • V(vertex)是顶点的非空有限集合 • E(edge)是边的有限集合, 而边是顶点对的集合。
7.2.2.邻接表表示
邻接表是图的链式存储结构
1. 无向图的邻接表 顶点:通常按编号顺序将顶点数据存储在一维数组中 ; 下标 编号 link 关联同一顶点的边:用线性链表存储
V0 V1
V2 0 1 2 3 4 m-1
V3
表头 数据
V4
指向邻接表 的指针
V0 V1 V2 V3 V4
1 0 1
0
1
0 1 2 3 4 m-1 V0 V1 V2 V3 V4 1 0 1
0
3 2 3 2 2
邻接表的空间代价 与图的边及顶点数均有关
V0
V1
4
V2
V3 V4
4
1
4. 邻接表在C语言中的类型定义 typedef struct node //定义 边结点的类型 { char adjver; //边的邻接点的数据 struct node *next; //指向本边下一邻接点的指针 }edgenode; typedef struct { //定义 顶点的类型 char vertex; //顶点的数据 edgenode *link; //指向本边邻接表 }vernode;
无向图中顶点的度
有向图中顶点的度=入度+出度 生成树、生成林
V0
V2 V3 V0
V1
V4 V1
V2
V3
有向边(弧)、弧尾、弧头;无向边(边) 无向图:在图G中,若所有边是无向边
有向图:在图G中,若所有ห้องสมุดไป่ตู้是有向边
混和图:在图G中,即有无向边也有有向边
完全图:
无向完全图:任意两顶点间都有边的图。 在一个含有n个顶点的无向完全图中,有n(n-1)/2条边。 有向完全图:任意两顶点之间都有方向互为相反的两条弧相连
3 2 3 2 2
4
4
邻接结点 指向下一邻 数据 接点的指针
2.有向图的邻接表和逆邻接表 1)有向图的邻接表(出边表) 顶点:用一维数组存储(按编号顺序) 以同一顶点为起点的弧:用线性链表存储
下标 编号 0 1 2 3 link
V0 V1 V2 V3
1
2
V0
V1
3 0
V2
V3
m-1
2)有向图的逆邻接表(入边表) 顶点:用一维数组存储(按编号顺序) 以同一顶点为终点的弧:用线性链表存储
2. 图的基本术语
有向图、无向图
V0
V2 V3 V0
V1
有向边(弧)、弧尾、弧头
无向边(边) 完全图:总边数
有向完全图、无向完全图:
V4 V1
子图 路径、路径长度 简单路径、简单回路 连通图、连通分量、强连通图 网络:带权的图
V2
V3
邻接点、相邻接、边与顶点关联
极大强连通子图意思是:该子图是D强连通子图
,将D的任何不在该子图中的顶点加入,子图不 再是强连通的;
强连通分量 V0 V1 V0 V1
V2
V3
V2
V3
生成树 包含无向图G 所有顶点的的极小连通子图称为G 的生成树 极小连通子图意思是:该子图是G 的连通子图,在该子图中删除任何一 条边,子图不再连通, 若T是G 的生成树当且仅当T 满足如下条件 T是G 的连通子图 T包含G 的所有顶点 T中无回路
V0 V1
V2
V3 V4
G1=<V1,E1> V1={v0 ,v1,v2,v3,v4} E1={(v0,v1),(v0,v3),(v1,v2),(v1,v4),(v2,v3)(v2,v4)}
图的应用举例:
例1 交通图(公路、铁路) 顶点:地点 边:连接地点的公路 交通图中的有单行道双行道,分别用有向边、无向边表示; 例2 电路图 顶点:元件 边:连接元件之间的线路 例3 通讯线路图 顶点:地点 边:地点间的连线 例4 各种流程图 如产品的生产流程图 顶点:工序 边:各道工序之间的顺序关系
相关文档
最新文档