没有合适的资源?快使用搜索试试~ 我知道了~
图论初步.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 93 浏览量
2023-03-13
20:58:04
上传
评论
收藏 438KB DOCX 举报
温馨提示
试读
20页
。
资源推荐
资源详情
资源评论
图论初步
本章知识点:
1)图论中涉及的几个概念
2)图的存储方法
3)图的深度遍历和广度遍历
4)图论中经典算法(Prim 算法和 Kruskal 算法求最小生成树;Dijkstra 算法、SPFA 算法和 Floyed 算法求
最短路径;拓扑排序算法;关键路径)
图是一种数据结构,方便存取我们所要处理的数据。图中有二个重要的组成部分:点和边。
图论是解决处理图这种数据结构的算法,以使我们建立了图这种模型后能够高效方便的出结果(在信
息学竞赛范围内讨论)。在图论中,有很多经典的算法,比如求最短路径、最小生成树等。我们这讲的重
点就是掌握图的基本概念和常用图论算法。
一.图中的几个概念
1.图的定义
简单讲,一个图是由一些点和这些点之间的连线组成的。严格意义讲,图是一种数据结构,定义为:
graph=(V,E),V 是点(称为“顶点”)的非空有限集合,E 是线(称为“边”)的集合,边一般用(v ,
x
v )表示,其中 v ,v 属于 V。
y
x
y
图(A)共有 4 个顶点、5 条边,表示为:V={v ,v ,v ,v },E={(v ,v ),(v ,v ),(v ,v ),(v ,
1
2
3
4
1
2
1
3
1
4
2
v ),(v ,v )}
4
3
2
2.图的分类
图分为无向图和有向图两大类:如果边是没有方向的,称此图为“无向图”,如图(A)和图(C),用
一对圆括号表示无向边,如图(A)中的边(v ,v ),显然(v ,v )和(v ,v )是两条等价的边,所以
y
1
2
x
y
x
在上面 E 的集合中没有再出现边(v ,v )。
2
1
如果边是有方向(带箭头)的,则称此图为“有向图”,如图(B),用一对尖括号表示有向边,如图
(B)中的边<v ,v >。把边<V ,V >中 V 称为起点,V 称为终点。显然此时边<v ,v >与边<v ,v >是不同
x
1
2
x
y
x
y
的两条边。有向图中的边又称为弧,起点称为弧头,终点称为弧尾。
y
y
x
图(B)表示为:V={v ,v ,v },E={<v ,v >,<v ,v >,<v ,v >,<v ,v >}
2
1
2
3
1
2
1
3
2
如果两个顶点 U、V 之间有一条边相连,则称 U、V 这两个顶点是关联的。
3
3
3.图的权
一个图中的两顶点间不仅是关联的,而且在边上还标明了数量关系,如图(C),这种数量关系可能是
距离、费用、时间、电阻等等,这些数值称为相应边的权。边上带有权的图称为带权图,也称为网(络)。
4.图的阶
1/20
图中顶点的个数称为图的阶。图(A)、图(B)、图(C)的阶分别为 4、3、5。
5.图的度
图中与某个顶点相关联的边的数目,称为该顶点的度。度为奇数的顶点称为奇点,度为偶数的顶点称
为偶点。图(A)中顶点 v ,v 是奇点,v ,v 是偶点。
1
2
3
在有向图中,把以顶点V 为终点的边的数目称为顶点 V 的入度,把以顶点U 为起点的边的数目称为顶
4
点 U 的出度,出度为 0 的顶点称为终端顶点。如图(B)中顶点 v 的入度是 0、出度是 2,v 的入度是 2、
2
1
出度是 1,v 的入度是 2、出度是 1,没有终端顶点。
3
定理 1:无向图中所有顶点的度之和等于边数的 2 倍,有向图中的所有顶点的入度之和等于所有顶点
的出度之和。
定理 2:任意一个无向图一定有偶数个(或 0 个)奇点。
6.图的路径
在一个 G = (V,E)的图中,从顶点 v 到顶点 v’的一条路径是一个顶点序列 v ,v ,v ,„„, v ,
i0
i1
i2
其中 v = v, v = v’,若此图是无向图,则(v ,v )∈E,1≤j≤m;若此图是有向图,则<v ,v >
im
i0
im
ij-1
ij
ij-1
ij
∈E,1≤j≤m。路径长度是指路径上的边或弧的数目。序列中顶点不重复出现的路径称为简单路径,顶点
v 和顶点 v’相同的路径称为回路(或环)。除了第一个顶点和最后一个顶点之外,其余顶点不重复出现的
回路,称为简单回路(或简单环)。
7.完全图与子图
若无向图中的任意两个顶点之间都存在着一条边,有向图中的任意两个顶点之间都存在着方向相反的
两条边,则称此图为完全图。n 阶完全有向图含有 n*(n-1)条边,n 阶完全无向图含有 n*(n-1)/2 条边,
当一个图接近完全图时,称为稠密图;相反,当一个图的边很少时,称为稀疏图。
设有两个图 G =(V,E)和 G’=(V’,E’),若 V’是 V 的子集,E’是 E 的子集,则称 G’为 G 的
子图。换句话说,子图就是图中的一部分。
8.图的连通
在无向图 G 中,如果从顶点 U 到顶点 V 有路径,则称 U 和 V 是连通的。如果对于图 G 中的任意两个顶
点 U 和 V 都是连通的,则称图 G 是连通图,否则称为非连通图。
在有向图 G 中,如果对于任意两个顶点 U 和 V,从 U 到 V 和从 V 到 U 都存在路径,则称图 G 是强连通
图。
二.图的存储
1.邻接矩阵表示法
邻接矩阵是表示顶点之间相邻关系的矩阵,设 G={V,E}是一个度为 n 的图(顶点序号分别用 1,2,„„,
n 表示),则 G 的邻接矩阵是一个 n 阶方阵,G[i,j]的值定义如下:
1 或权值
当 v 与 v 之间有边或弧时,取值为 1 或权值
j
i
G[ i,j ]=
0 或∝
当 v 与 v 之间无边或弧时,取值为 0 或∝(无穷大)
j
i
上面 3 个图对应的邻接矩阵分别如下:
0 1 1 1
G(A)= 1 0 1 1
1 1 0 0
0 1 1
∞ 5
8
2
∞ 3
∞ 6
G(B)= 0 0 1
G(C)= 5 ∞
0 1 0
8
2
∞ 10 4
∞ ∞ 10 ∞ 11
11 ∞
1 1 0 0
3
6
4
2/20
图的邻接矩阵表示算法描述(以无向带权图为例)
邻接表数据结构
Const n={图的顶点数}; e={图中的边数};
Type adjmatrix=array[1..n,1..n] of 0..1;{下标变型也可为其它子域型或自定义型,若表示带权图,则成分
类型应为权值所属类型}
Vexlist=array[1..n] of elemtype; {elemtype为顶点元素类型}
Procedure create1(GA); {图用邻接矩阵存储}
Begin
readln(n,e);
for i:=1 to n do
for j:=1 to n do
GA[i,j]:=maxint;
For k:=1 to e do {建立邻接矩阵}
Begin
read(i,j,w); {读入边(Vi,Vj)两端点序号及边上的权}
GA[i,j]:=w;
GA[j,i]:=w;
End;
End;
采用邻接矩阵表示图,直观方便,很容易查找图中任两个顶点 i 和 j 之间有无边(或弧),以及边上
的权值,只要看 A[i,j]的值即可,因为可以根据 i,j 的值随机查找存取,所以时间复杂性为O(1)。也很
容易计算一个顶点的度(或入度、出度)和邻接点,其时间复杂性均为 O(n)。但是,邻接矩阵表示法的
空间复杂性为 O(n*n),如果用来表示稀疏图,则会造成很大的空间浪费。
2.边集数组表示法
边集数组是利用一维数组存储图中所有边的一种图的表示方法。每个数组元素存储一条边的起点、终
点和权值(如果有的话)。在边集数组中查找一条边或一个顶点的度都需要扫描整个数组,所以其时间复
杂性为 O(e),e 为边数。这种表示方法适合那些对边依次进行处理的运算,而不适合对顶点的运算和对
任意一条边的运算。从空间复杂性上讲,边集数组适合于存储稀疏图。
图的边集数组表示算法描述(以无向带权图为例)
Type Edgenode=record {定义边集数组的元素(或称边结点)类型}
Formvex,endvex:1..n;{边的起点和终点域,亦可定义为其它子域型或自定义型}
weight: {权值所属类型,对无权图可省去}
next:edgeptr {链域}
end;
edgeset=array[1..m] of edgenode; {定义边集数组类型,其中 m 要大于等于图中的边数 e};
Procedure create3(GE); {图用边集数组存储}
Begin
for k:=1 to e do
Begin
read(i,j,w); {读入一条边(Vi,Vj)的两端点序号及权值}
GE[k].formvex:=i;
3/20
GE[k].endvex:=j;
GE[k].weight:=w
End;
End;
3.邻接表表示法(链式存储法)
邻接表表示法是指对图中的每个顶点 v (1≤i≤n)建立一个邻接关系的单链表,并把它们的表头指
i
针用一维向量数组存储起来的一种图的表示方法。为每个顶点 v (1≤i≤n)建立的单链表,是表示以该
i
顶点为起点的所有边的信息(包括一个终点(邻接点)序号、一个权值和一个链接域)。一维向量数组除
了存储每个顶点的表头指针外,还要存储该顶点的编号i。图(C)的邻接表表示为:
图的邻接表表示算法描述(以有向图为例)
Const n={图的顶点数}; e={图中的边数};
Type edgeptr=^edgenode;
Edgenode=record {定义边结点}
Adjvex:1..n;{邻接点域,亦可定义为其它子域型或自定义型}
weight: {权值所属类型,对无权图可省去}
next:edgeptr {链域}
end;
vexnode=record {定义表头结点}
data:elemtype;
link:edgeptr;
end;
adjlist=array[1..n] of vexnode; {定义表头向量};
Procedure create2(GL); {图用邻接表存储}
Begin
for i:=1 to n do
begin read(GL[i].data);GL[i].link:=nil; end;
for k:=1 to e do {建立邻接表}
Begin
read(i,j); {读入一条边<Vi,Vj>的两端点序号}
new(s);s^.adjvex:=j;
s^.next:=GL[i].link;GL[i].link:=s;
End;
End;
图的邻接表表示法便于查找任一顶点的关联边及邻接点,只要从表头向量中取出对应的表头指针,然
4/20
剩余19页未读,继续阅读
资源评论
คิดถึง643
- 粉丝: 3917
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于JavaScript和CSS的随寻订购网页设计源码 - web-order
- 基于MATLAB的声纹识别系统设计源码 - VoiceprintRecognition
- 基于Java的微服务插件集合设计源码 - wsy-plugins
- 基于Vue和微信小程序的监理日志系统设计源码 - supervisionLog
- 基于Java和LCN分布式事务框架的设计源码 - tx-lcn
- 基于Java和JavaScript的茶叶评级管理系统设计源码 - tea
- IMG_5680.JPG
- IMG_0437.jpg
- 基于Java的JAVA项目分析工具设计源码 - JAVAProjectAnalysis
- top888.json
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功