数据结构图结构
数据结构--图重点

DFSTree(G, w, q, visited);
生成森林:不完全图中的各个连通分量的生成树,构成图的生成森林
二、存储结构
顶点:可采用链表或数组存储顶点列表,一般采用链表存储
边:1.邻接矩阵(数组)
a.无向图:对称阵,可采用矩阵压缩存储方式。A[i][j] = 0表示 和 没有连接;A[i][j]= 1表示 和 有边连接;第i行的和表示顶点 的度
b.有向图:不对称阵。 表示顶点 到 的有向弧的权值; 表示表示顶点 到 没有弧连接或者i = j
enQueue(Q, w);
}
w = getNextNeighbor(G, v, w);
}
}
delete[] visited;
}
四、图的连通性问题(无向图)
1.深度优先生成树(深度优先搜索形成),广度优先生成树(广度优先搜索形成)
深度优先生成森林算法:
void DFSForest(Graph G, CSTree& T) {
CSTree q=null;
int n = G.vexnum;
bool* visited = new bool[n];
for(int i = 0; i < n; i++)visited[i] = false;
for (int v = 0; v < n; v++) {
if (!visited[v]) {
}
}
}
深度优先生成树算法:
void DFSTree(Graph G, int v, CSTree T, bool& visited[]){
visited[v] = true;
《数据结构图论部分》PPT课件

Page 4
2020/11/24
哥尼斯堡七桥问题
能否从某个地方出发,穿过所有的桥仅一次 后再回到出发点?
Page 5
2020/11/24
七桥问题的图模型
欧拉回路的判定规则:
1.如果通奇数桥的地方多于
C
两个,则不存在欧拉回路;
2.如果只有两个地方通奇数
桥,可以从这两个地方之一
A
B 出发,找到欧拉回路;
V4 是有向边,则称该图为有向图。
Page 9
2020/11/24
简单图:在图中,若不存在顶点到其自身的边,且同 一条边不重复出现。
V1
V2
V3
V4
V5
非简单图
V1
V2
V3
V4
V5
非简单图
V1
V2
V3
V4
V5
简单图
❖ 数据结构中讨论的都是简单图。
Page 10
2020/11/24
图的基本术语
邻接、依附
DeleteVex(&G, v); 初始条件:图 G 存在,v 是 G 中某个顶点。 操作结果:删除 G 中顶点 v 及其相关的弧。
Page 34
2020/11/24
InsertArc(&G, v, w); 初始条件:图 G 存在,v 和 w 是 G 中两个顶点。 操作结果:在 G 中增添弧<v,w>,若 G 是无向的,则还
Page 2
2020/11/24
• 知识点
– 图的类型定义 – 图的存储表示 – 图的深度优先搜索遍历和广度优先搜索遍历 – 无向网的最小生成树 – 拓扑排序 – 关键路径 – 最短路径
Page 3
数据结构:图

数据结构:图在计算机科学领域,数据结构是我们组织和存储数据的方式,以便能够高效地进行操作和处理。
而图,作为一种重要的数据结构,在许多应用中都发挥着关键作用。
想象一下,我们生活中的各种关系,比如朋友关系、交通网络、电路连接等等,这些都可以用图来表示。
图由顶点(也称为节点)和边组成。
顶点代表着事物或者对象,而边则表示顶点之间的关系。
比如说,在一个社交网络中,每个人可以看作是一个顶点,如果两个人是朋友,那么在他们对应的顶点之间就会有一条边。
这种直观的表示方式让我们能够清晰地理解和分析复杂的关系。
图有两种主要的表示方式:邻接矩阵和邻接表。
邻接矩阵就像是一个表格,行和列都对应着顶点,如果两个顶点之间有边相连,对应的位置就标记为 1,否则为 0 。
这种表示方式简单直观,但当顶点数量很多而边的数量相对较少时,会浪费大量的存储空间。
邻接表则是为每个顶点创建一个链表,链表中存储着与该顶点相邻的顶点。
这种方式在处理稀疏图(边的数量相对较少的图)时,能够节省大量的空间,并且在查找相邻顶点时也比较高效。
图的遍历是操作图的重要方式之一。
深度优先遍历就像是在迷宫中一直往前走,直到走不通了再回溯;而广度优先遍历则像是以一个点为中心,一层一层地向外扩展。
深度优先遍历通常使用递归的方式实现。
从一个起始顶点开始,沿着一条路径尽可能地深入,直到无法继续,然后回溯,尝试其他的路径。
这种遍历方式在搜索、查找路径等问题中经常被使用。
广度优先遍历则使用队列来实现。
先将起始顶点入队,然后依次取出队列头部的顶点,并将其相邻的未访问过的顶点入队。
这种方式常用于计算最短路径、层次遍历等问题。
图的应用非常广泛。
在网络路由中,通过构建网络的图模型,可以找到最优的数据包传输路径;在任务调度中,可以根据任务之间的依赖关系,使用图来安排任务的执行顺序;在地图导航中,城市和道路可以表示为图,从而为用户规划最佳的出行路线。
再比如,在人工智能中的搜索算法中,图可以用来表示状态空间。
数据结构-图

出发点,访问D,标注数字序号④;
(a)无向图 G9
(b)深度优先遍历
图的遍历
3.1图的深度优先遍历
接着到G,访问G, 标注数字序号⑤;G 相邻顶点都访问过了,顺着虚线箭头方向
回退到 D,D 相邻顶点都访问过了,顺着虚线箭头方向回退到C,C 相邻顶点也都访问过
图的基本概念
1.2图的操作定义
02
PART
图的存储结构
2.1邻接矩阵
首先介绍的是数组表示法,即用两个数组分别存储顶点的信息和顶点之间的关系。
用来存放图中 n 个顶点的数组称为顶点数组。我们可将图中顶点按任意顺序保存到顶点数组中,
这样按存放次序每个顶点就对应一个位置序号(简称位序),依次为0~n-1;接着用一个 n×n 的二维
称为有向图。例如,当V={v1,v2,v3,v4,v5},VR={<v1,v2>,
<v1,v4>,<v2,v4>,<v3,v1>,<v3,v5>,<v4,v3>,<v5,v4>},则顶点集合
V、关系集合VR 构成有向图G1=(V,VR),如图(a)所示。
图的基本概念
1.1图的定义与基本术语
无向图(Undirected Graph)。如果顶点间的关系是无
序号作为表结点的值,所以一条弧对应一个表结点。右图为有向图 G1
和无向图 G2的邻接表表示法存储示意图。
图的存储结构
2.2邻接表
对于有向网和无向网,由于表结点表示边或弧,因此需要对表结点扩充一个属性域,表
结点至少包含顶点序号、权值和下一表结点指针 3 个属性,由此构成网的邻接表。
数据结构图

所以:对于点多边少的稀疏图来说,采用邻接表 结构使得算法在时间效 率上大大提高。
16
3/12
广度优先搜索(Breadth First Search,简称BFS ) BFS类似于树的层序遍历; 用一个数组用于标志已访问与否,还需要一个工作队列。
【例】一个无向图的BFS
8
6
CD
4
7
HG
BA
邻接多重表(Adjacency Multilist)
9
边表
• 在某些应用中,有时主要考察图中边的权值以及所依附的 两个顶点,即图的结构主要由边来表示,称为边表存储结 构。
• 边表结构采用顺序存储,用2个一维数组构成,一个存储 顶点信息,一个存储边的信息。边数组的每个元素由三部 分组成:
– 边的起点下标 – 边的终点下标 – 边的权值
1
A [i][
j]
0
如果 (vi , v j ) 或 vi , v j G的边 其它
无权图的邻接矩阵表示示例
V1
V2
V0
3
V3
4 12/15
带权图的邻接矩阵的定义
A [i][ j] wij
如果 (vi , vj ) 或 vi , v j G的边 其它
带图权的图邻的接邻矩接阵矩表阵示表示示例示[例例6.9]
1
第一部分 图的定义和术语
2
图的定义
“图” G可以表示为两个集合:G =(V, E)。每条 边是一个顶点对(v, w) E ,并且 v, w V。
通常:用 |V| 表示顶点的数量(|V| ≥ 1), 用 |E| 表示边的数量(|E| ≥ 0)。
(1) 无向图(完全有向图边数与顶点数之间的 关系) (2) 有向图(完全有向图弧数与顶点数之间的 关系) (3) 简单图:没有重边和自回路的图 (4) 邻接 (5) 路径,路径长度 (6) 无环(有向)图:没有任何回路的(有向)图 (7) 度,入度,出度 (8) 无向图的顶点连通、连通图、连通分量 (9) 有向图的顶点强连通,强连通图、连通分量
数据结构-图及其存储结构

for (j=0;j<G.vexnum;+ +j ) adj Info G.arcs[i][j]={∞,NULL}; //Arccell的形式为: for (k=0;k<G.arcnum;+ +i ) { //二维数组存放各边上的信息 scanf(v1,v2,w); i=locatevex(G,v1); j=locatevex(G,v2); //求顶点v1,v2在图中的位置 G.arcs[i][j].adj=w; G.arcs[j][i].adj=w; //无向网的邻接矩阵是对称的 if (IncInfo) Input (*G.arcs[i][j].info); //将弧上的信息存储在指针info
case UDN: return CreateUDN(G);
default : return ERROR; }//CreateGraph
二、存储结构
2.数组表示法前提下图的输入
*以无向网为例,即当用户输入图的类型标志为UDN时,有:
Status CreateUDN(MGraph &G){ scanf(G.vexnum,G.arcnum,IncInfo); //IncInfo 为0时表示各弧
v2 6 5
v1 5 1 5 v3 3 6 4 2 v4
一个连通无向图的生成树是该图的一个连通分量,它 包含有该图的所有n个顶点以及连接这n个顶点的(n-1) 条边。 边或弧上带权值的图称为带权图或网(分为无向网和 有向网)。 一个无向图的所有生成树中,边上的权值之和最小的 生成树称为该图的最小生成树或最小代价生成树。
《数据结构之图》相关知识点总结

第5章图●图的定义①图由顶点集V和边集E组成,记为G=(V,E),V(G)是图G中顶点的有穷非空集合,E(G)是图G中顶点之间变得关系集合,|V|表示顶点个数,也称图的阶,|E|表示边数(线性表和树都可以是空的,但图可以只有一个顶点没有边)②有向图:弧是顶点的有序对,记为<v,w>,v,w是顶点,v是弧尾,w是弧头,从顶点v到顶点w的弧。
无向图:边是顶点的无序对,记为(v,w)③简单图:一个图满足:不存在重复边;不存在顶点到自身的边。
多重图相对于简单图定义④完全图:无向图中,任意两顶点之间存在边,称为完全无向图。
N个顶点的无向完全图有n(n-1)/2条边。
在有向图中,任意两顶点之间存在方向相反的两条弧,称为有向完全图,N 个顶点的有向完全图有n(n-1)条边。
⑤连通图:在无向图中任意两顶点都是连通的。
无向图中的极大连通子图称为连通分量。
极大要求连通子图包含其所有的边和顶点,极小连通子图既要保持图连通,又要保持边数最少⑥在有向图中任意两顶点v,w,存在从顶点v到顶点w和从顶点w到顶点v两条路径,这种图称为强连通图。
有向图的极大强连通子图称为有向图的强连通分量。
⑦生成树:①包含图中所有顶点n,②生成树有n-1条边, ③任意两点连通。
对生成树而言,砍去一条边变成非连通图,加上一条边形成一个回路。
在非连通图中,连通分量的生成树构成了非连通图的生成森林。
⑧顶点的度:以该顶点为端点的边的数目。
无向图的全部顶点的度之和等于边数的两倍。
有向图的度等于出度和入度之和,入度是以该顶点为终点的有向边的数目,出度是以该顶点为起点的有向边的数目。
有向图的全部顶点的入度之和和出度之和相等且等于边数。
⑨图中每条边可以标上具有某种含义的数值,该数值称为边的权值。
带有权值的图称为网。
○10对于无向图G=(V, {E}),如果边(v,v’)∈E,则称顶点v,v’互为邻接点,即v,v’相邻接。
边(v,v’)依附于顶点v 和v’,或者说边(v, v’)与顶点v 和v’相关联。
《数据结构》第 7 章 图

v3
v4 v5 v4
v3
v5 v4
v3
v5 v4
v3
v5 v4
v3
v5
注
一个图可以有许多棵不同的生成树。 所有生成树具有以下共同特点: 生成树的顶点个数与图的顶点个数相同; 生成树是图的极小连通子图; 一个有 n 个顶点的连通图的生成树有 n-1 条边; 生成树中任意两个顶点间的路径是唯一的; 在生成树中再加一条边必然形成回路。 含 n 个顶点 n-1 条边的图不一定是生成树。
A1 = {< v1, v2>, < v1, v3>, < v3, v4>, < v4, v1>} v1 v2
有向图
v3
v4
制作:计算机科学与技术学院 徐振中
数据结构 边:若 <v, w>∈VR 必有<w, v>∈VR,则以 无序对 (v, w) 代表这两个有序对,表示 v 和 w 之 间的一条边,此时的图称为无向图。 G2 = (V2, E2) V2 = {v1, v2, v3, v4, v5}
第七章 图
E2 = {(v1, v2), (v1, v4), (v2, v3), (v2, v5) , (v3, v4), (v3, v5)} v1
G2
v3
v2
无向图
v4
v5
制作:计算机科学与技术学院 徐振中
数据结构
第七章 图
例:两个城市 A 和 B ,如果 A 和 B 之间的连线的涵义是 表示两个城市的距离,则<A, B> 和 <B, A> 是相同的, 用 (A, B) 表示。 如果 A 和 B 之间的连线的涵义是表示两城市之 间人口流动的情况,则 <A, B> 和 <B, A> 是不同的。 北京 <北京,上海> (北京,上海) <上海,北京> <北京,上海> 北京 上海 上海
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
多对多 (m:n)
第7章 图
特点:非线性结构,是研究数据元素之 间的多对多的关系。在这种结构中,任 意两个元素之间可能存在关系。即结点 之间的关系可以是任意的,图中任意元 素之间都可能相关。
图的应用极为广泛,已渗入到诸如语 言学、逻辑学、物理、化学、电讯、计 算机科学以及数学的其它分支。
01 0 01 0 10 v4
0 10 10 10 0 v5
分析1:无向图的邻接矩阵是对称的;
分析2:顶点i 的度=第 i 行 (列) 中1 的个数;
特别:完全图的邻接矩阵中,对角元素为0,其余全1。
例2 :有向图的邻接矩阵
v1
A
v3
v2
顶点表: ( v1 v2 v3 v4 ) 邻接矩阵: 0 10 01 0 v1
A.Edge = 0 0 0 0 v2
v4
0 0 0 01 v3
01 0 0 0 v4
注:在有向图的邻接矩阵中, 第i行含义:以结点vi为尾的弧(即出度边); 第i列含义:以结点vi为头的弧(即入度边)。
分析1:有向图的邻接矩阵可能是不对称的。 分析2:顶点的出度=第i行元素之和,OD( Vi )= A.Edge[ i ][j ]
与v2是连通的。如果图中任意一对顶点都是连通的, 则称此图是连通图。
非连通图的极大连通子图叫做连通分量。
强连通图:在有向图中, 若对于每一对顶点vi和vj, 都存在一条从
vi到vj和从vj到vi的路径, 则称此图是强连通图。 非强连通图的极大强连通子图叫做强连通分量。
有两类图形 不在本章讨 论之列:
邻接矩阵法容优易点实:现图的操作,如:求某顶点的度、判断顶点之 间是否有边(弧)、找顶点的邻接点等等。
邻接矩阵法n缺个点顶:点需要n*n个单元存储边(弧);空间效率为O(n2)。
对稀疏图而言尤其浪费空间。
图的邻接矩阵存储表示(参见教材P161)
注:用两个数组分别存储顶点表和邻接矩阵
#define INFINITY INT_MAX
邻接表
v1
v2
v3
v4
v5
0 v1
3
1^
1 v2
4
2
0^
2 v3
4
3
1^
3 v4
4
2
0^
4 v5
3
2
1^
注:邻接表不唯一,因各个边结点的链入顺序是任意的。
例2:有向图的邻接表
邻接表(出边)
v1
v2
V1
2
1^
V2 ^
v3
v4
V3
3^
V4
0^
逆邻接表(入边)
V1
3^
V2
0^
V3
0^
V4
2^
例3:已知某网的邻接(出边)表,请画出该网络。
} // CreateUDN 对于n个顶点e条弧的网, 建网时间效率 = O(n2+n+e*n)
二、邻接表(链式)表示法
❖ 对每个顶点vi 建立一个单链表,把与vi有关联的边的信息(即 度或出度边)链接起来,表中每个结点都设为3个域;
头结点
表结点
data firstarc
adjvex nextarc info
for(k=0;k<G.arcnum;++k){ //给邻接矩阵有关单元赋初值(循环次数=弧数 scanf(&v1, &v2, &w); //输入弧的两顶点以及对应权值 i=LocateVex(G,v1); j=LocateVex(G,v2); //找到两顶点在矩阵中的位置(n次? G.arcs[i][j].adj=w; //输入对应权值 If(IncInfo) Input(*G.arcs[i][j].info); //如果弧有信息则填入 G.arcs[j][i] = G.arcs [i] [j]; //无向网是对称矩阵 } return OK;
InsertVex ( &G, v);
大小写含义
初始条件:图G存在,v和图中顶点有相同特征。 不同!
操作结果:在图G中添加新顶点。
………………(参见P156-257)
}
7.2 图的存储结构
图的特点:非线性结构(m :n )
顺序存储结构: 无!(多个顶点,无序可言) 但可用数组描述元素间关系。
链式存储结构: 可用多重链表
② 完全有向图有n(n-1)条边。 证明:若是完全有向图,则顶点1必与所有其他顶点各有2条连 线,即有2(n-1)条边, 顶点2有2(n-2)条边,…,顶点n-1有2条 边,顶点n有0条边. 总边数=2( n-1+ n-2+…+1+0)=2(n-1+0)n/2= n(n-1)
例:判断下列4种图形各属什么类型?
1, 如果< i, j > E 或者 (i, j) E A.Edge [i][ j] 0, 否则
例1:
v1
v2
A
v3
v4
v5
顶点表: ( v1 v2 v3 v4 v5 )
邻接矩阵: 0 10 0 01 0 v1
A.Edge =
01 0 01 0 01 0 01 0 01 01
v2 v3
数据关系R:R={VR};VR={<v,w>|v,w∈V 且 P(v,w), <v,w>表示从v到w的弧, 谓词P(v,w)定义了弧<v,w>的意义或信息}
基本操作P:
CreatGraph ( &G, V,VR);
初始条件:V是图的顶点集,VR是图中弧的集合。
操作结果:按V和VR的定义构造图G。
注意:V 的
GraphKind kind; //图的种类标志
}Mgraph;
对于n个顶点的图或网,空间效率=O(n2)
例:用邻接矩阵生成无向网的算法(参见教材P162)
Status CreateUDN(Mgraph &G){ //无向网的构造,用邻接矩阵表示
scanf(&G.vexnum, &G.arcnum, &IncInfo); //输入总顶点数,总弧数和信息
以有向网为例:
顶点表: ( v1 v2 v3 v4 v5 v6 )
v1 5
v2
邻接矩阵: ∞∞ 5∞5∞∞∞7∞7 ∞∞ ∞
N
3
7
8
v6
9
1
6
v5
v4
5
4 v3
5
N.Edge = ∞∞∞∞ ∞44∞∞∞∞∞∞
∞88∞ ∞∞∞∞∞∞∞ 9 9 ∞∞∞∞ ∞5 5∞∞∞∞∞ 6 6 ∞∞∞∞ ∞ ∞5∞5∞∞∞ ∞33 ∞ ∞∞∞∞∞1∞1∞
无向 完全图
无向图(树)
有向图 有向完全图
n(n-1)/2 条边
n(n-1) 条边
G1的顶点集合为V(G1)={0,1,2,3} 边集合为E(G1)={(0,1),(0,2),(0,3),(1,2),(1,3),(2,3)}
稀疏图: 边较少的图。通常边数<<n2 稠密图:边很多的图。无向图中,边数接近n(n-1)/2 ;
路径长度:非带权图的路径长度是指此路径上 边的条数;
带权图的路径长度是指路径上各边的权之和。
简单路径:路径上各顶点 v1,v2,...,vm 均不互相重复。
回 路: 若路径上第一个顶点 v1 与最后一个顶点vm 重合,
则称这样的路径为回路或环。
例:
图的抽象数据类型
ADT Graph { 数据对象V:v是具有相同特性的数据元素的集合,称为顶点集。
有向图中,边数接近n(n-1)
子 图: 设有两个图 G=(V, E) 和 G’=(V’, E’)。若 V’ V 且
E’ E, 则称 图G’ 是 图G 的子图。
带权图:即边上带权的图。其中权是指每条边可以标上 具有某种含义的数值(即与边相关的数)。
网 络:=带权图 连通图: 在无向图中, 若从顶点v1到顶点v2有路径, 则称顶点v1
当邻接表的存 储结构形成后, 图便唯一确定!
1 64
5
80 2
邻接表存储法的特点:—它其实是对邻接矩阵法的一种改进 分析1:对于n个顶点e条边的无向图,邻接表中除了n个头结点外,
//最大值∞
#define MAX_VERTEX_NUM 20 //假设的最大顶点数
Typedef enum {DG, DN, AG,AN } GraphKind; //有向/无向图,有向/无向网
Typedef struct ArcCell{ //弧(边)结点的定义 VRType adj; //顶点间关系,无权图取1或0;有权图取权值类型 InfoType *info; //该弧相关信息的指针
数据域,存 储顶点vi 信 息
链域,指向 单链表的第 一个结点
邻接点域,表 示vi一个邻接 点的位置
链域,指向 vi下一个边 或弧的结点
数据域,与 边有关信息 (如权值)
❖ 每个单链表还应当附设一个头结点(设为2个域),存vi信息; ❖ 每个单链表的头结点另外用顺序存储结构存储。
例1:无向图的邻接表
有向图:图G中的每条边都是有方向的; 无向图:图G中的每条边都是无方向的; 完全图:图G任意两个顶点都有一条边相连接;
❖若 n 个顶点的无向图有 n(n-1)/2 条边, 称为无向完全图 ❖若 n 个顶点的有向图有n(n-1) 条边, 称为有向完全图
证明:
①完全无向图有n(n-1)/2 条边。 证明:若是完全无向图,则顶点1必与所有其他顶点各有1条连 线,即有n-1条边,顶点2有n-2条边,…,顶点n-1有1条边,顶点 n有0条边. 总边数= n-1+ n-2+…+1+0=(n-1+0)n/2= n(n-1)/2