C语言——图(上)(图的定义及术语、存储结构及其遍历)

前言

本篇进入图的学习,继前篇树之后,将学习比树更加复杂的结构。有向图无向图或者是否闭合,都有广泛的应用。关于图在一些实际应用中的例子,本篇会给几个例子。(插图较多)

看完本篇,你将了解到:
(1)什么是图?什么是网?图的常用术语有哪些?
(2)图的相关操作(类比于树和线性表)
(3)图的表示方法(同样也有数组和链表两种),本篇将新介绍一个邻接表
(4)将重点讨论有向图和无向图的表示方法
(5)重点!!!图的遍历(常听到的深度优先搜索DFS及广度优先搜索BFS)

一、图的定义和术语

在线性表中,数据元素为一对一的关系,在图中,任意两个数据元素都可能相关

1.图的定义

(1)图G由顶点集V和关系集VR组成的二元组,记为:G=(V,VR)
(2)V(具有相同特征的数据元素的集合):图中的数据元素我们通常称为顶点,因此V也称为顶点(元素)的有穷非空集
(3)VR:两个顶点之间关系的集合
在这里插入图片描述

2.有向图、弧(有向边)

(1)若图G任意两顶点a,b之间的关系为有序对<a,b>,即<a,b>∈VR,则称<a,b>为从a到b的一条弧/有向边
(2)其中:a是<a,b>的弧尾(初始点)
b是<a,b>的弧尾(终止点)
(3)有向图:由顶点集合弧的集合组成的图
在这里插入图片描述

例:G1=(V,VR)
V={A,B,C,D,E}
VR={<A,C>,<A,D>,<C,D>,<B,E>,<E,B>}

3.无向图、边(无向边)

如果顶点间的关系是无序对,ab之间用()表示,称无序对表示顶点a与b的一条边
(1)无向图:由顶点集合与边的集合组成的图
(2)图中若a、b间有边,则称(a,b)表示a、b互为邻接点,(a,b)依附于a和b,(a,b)与a和b相关联

在这里插入图片描述

例:G2={V,VR}
V={V1,V2,V3,V4,V5,V6}
VR={(V1,V3),(V1,V5),(V3,V5),(V4,V6)}

4.完全图

(1)n:顶点的数目
(2)e:边或者弧的数目。
取值范围:0–n(n-1)/2 (若任意两个顶点间都有边,则e取最大值)
(3)有n个顶点和n(n-1)/2条边的无向图称为完全图

5.有向完全图

有n个顶点和n(n-1)条弧的有向图

在这里插入图片描述

6.网(Network)

边(弧)上加权的图,分为有向网和无向网

故有4种类型的图:有向图、无向图、有向网、无向网

7.图的常用术语

(1)子图:对图G=(V,VR)和G1=(V1,VR1),若V1是V的子集且VR1是VR的子集,则称G1是G的一个子图
在这里插入图片描述

G1,G2,G3均为G的子图,但G4不是
(2)度:无向图中与顶点v相关联的边(x,y)的数目,称为v的度
记作TD(v)或D(v)
无向图某顶点的度表示:该顶点有多少个邻接顶点
①出度OD(v):以顶点v为弧尾的弧的数目
②入度ID(v):以顶点v为弧头的弧的数目
在这里插入图片描述

	例:OD(A)=1		
	 	OD(B)=2
	 	OD(C)=0
	 	
	 	ID(A)=1		
	 	ID(B)=1
	 	ID(C)=1
	 	
	 	顶点的度: 
	 	TD(A)=OD(A)+ID(A)=2
	 	TD(B)=OD(B)+ID(B)=3
	 	TD(C)=OD(C)+ID(C)=1

(3)连通性的术语
顶点vi到vj有路径:存在一个顶点序列vi,vi1,vi2,…,vim,vj
其中(vi,vi1),(vi1,vi2),…,(vim,vj)是图的边或弧
(4)连通图及其分量(无向图G)
①若从顶点vi到vj有路径,则称二者是连通的
②连通图:图G中任意两顶点是连通的
③连通分量:无向图的极大连通子图
注:连通图的连通分量是自己,非连通图会有几个连通分量
在这里插入图片描述

(5)强连通图及强连通分量(有向图G)
①强连通图:图G中每对顶点vi,vj之间,从vi到vj,陈vj到vi都存在路径
②强连通分量:有向图的极大强连通子图
注:强连通图的强连通分量是自己
在这里插入图片描述
(6)生成树
连通图的极小连通子图 ,包含图中所有顶点和n-1条边
在这里插入图片描述

8.图的操作

(1)CreateCraph(&G,V,VR):根据顶点集V和关系集VR生成图
(2)DestroyCraph(&G):销毁图
(3)Locate(G,v):查找顶点u的位置
(4)GetVex(G,v):读取顶点v的信息
(5)PutVex(&G,v,value):给顶点v赋值
(6)FirstAdjVex(G,v):读v的第一个邻接点
(7)NextAdjVex(G,v,w):读v(相当于w)的下一个邻接顶点
(8)InsertVex(&G,v):插入顶点
(9)DeleteVex(&G,v):删除顶点
(10)InsertArc(&G,v,w):插入弧<v,w>
(11)DeleteArc(&G,v,w):删除弧<v,w>
(12)DFSTraverse(G,visit()):深度优先遍历图
(13)BFSTraverse(G,visit()):宽度优先遍历图

二、图的存储结构

1.数组表示法(易于判断两个顶点是否有关系)

(1)数组表示法:用两个数组分别存储数据元素(顶点)的信息和数据元素之间的关系
(2)顶点数组:用一维数组存储顶点(元素 )
(3)邻接矩阵:用二维数组存储顶点(元素)之间的关系(边或弧)

1)例1:无向图
在这里插入图片描述

①将4个顶点依次存放到顶点数组,保存所有顶点的信息
顶点数组vexs v1 v2 v3 v4
0 1 2 3
②用邻接矩阵(arcs)表示二者之间的关系:1表示顶点之间有关系,0表示顶点之间无关系
位置序号分别为i、j,若顶点vi和vj之间有边,则矩阵中aij和aji均赋值为1,否则为0

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柠檬茶@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值