数据结构-图的总结


一.思维导图
二.重要概念的笔记:
1.顶点的度、入度、出度:顶点的度是指依附于某顶点Vi的边数,通常记为TD(Vi);
顶点的入度(InDegree)是指以Vi为终点的弧的而数目,记为ID(Vi);
顶点的出度(OutDegree)是指以Vi为始点的弧的数目,记为OD(Vi);
于是有:TD(Vi) = ID(Vi)+OD(Vi);
2. 完全图:若无向图中的每两个顶点之间都存在着一条边,有向图中的每两个顶点之间都存在着方向相反的两条边,则称此图为完全图;无向完全图包含有n(n-1)/2条边,有向完全图包含有n(n-1)条边。
3.有向图:图中任意两个顶点之间的边都是有向边(顶点v到w之间的边有方向。有向边也称为弧(Arc),用有序偶对(v, w)表示。 v称为弧尾或初始点,w称为弧头或终点)。如:

4.无向图:图中任意两个顶点之间的边都是无向边(顶点v到w之间的边没有方向。用无序偶对(v, w)表示)。如:

5.完全图:若无向图中的每两个顶点之间都存在着一条边,有向图中的每两个顶点之间都存在着方向相反的两条边,则称此图为完全图。
1)有向完全图:在一个具有n顶点的有向图中,最多可能有n(n-1)条弧,具有n(n-1)条弧的n个顶点的有向图称为完全有向图,如:

2)无向完全图:在一个具有n个顶点的无向图中,倘若每个顶点与其他n-1个顶点之间都有边相连,则会有n(n-1)/2条边,这是具有n个顶点的无向图可能的最大边数。一个具有n(n-1)/2条边的n个顶点的无向图被称为无向完全图。如:

6.稠密图和稀疏图:
稠密图:当一个图接近完全图时,如:

稀疏图:当一个图含有较少的边数,如:

7.子图:
设有两个图G=(V,E)和G'=(V',E'),若V'是V的子集,且E'是E的子集,则称G'是G的子图
说明:图G的子图一定是个图,所以并非V的任何子集V'和E的任何子集E'都能构成G的子图,因为这样的(V',E')并不一定构成一个图。
8.连通、连通图和连通分量
在无向图中,若从顶点v 到顶点w 有路径存在,则称v 和w 是连通的。若图G 中任意两个顶点都是连通的,则称图G 为连通图,否则称为非连通图。无向图中的极大连通子图称为连通分量。若一个图有n 个顶点,并且边数小于n−1,则此图必是非连通图。
9.强连通图和强连通分量
在有向图G中,若从顶点i到顶点j有路径,则称从顶点i到顶点j是连通的,若图G中的任意两个顶点i和j都连通,即从顶点i到顶点j和从顶点j到顶点i都存在路径则称途径是强连通图。
注:强连通图只有一个强连通分量(即它本身)。
在一个非常连通图中找强连通分量的方法如下 :
(1)在图中找有向环。
(2)拓展该有向环:如果某个顶点到该环中的任何一项顶点都有路径,并且该环中的任一顶点到这个顶点也有路径,则加入这个顶点。
10.权和网
图中的每一条边都可以附有一个对应的数值,这种与边相关的数值称为权。权可以表示从一个顶点到另一个顶点的距离或花费的代价。边上带有权的图称为带权图,也称作网。如:

图的存储结构和基本运算算法
一.邻接矩阵存储方法:图的邻接矩阵(Adjacency Matrix) 存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。
设图G有n个顶点,则邻接矩阵A是一个n*n的方阵,定义为:

下图是一个无向图和它的邻接矩阵:

可以看出:
1.无向图的邻接矩阵一定是一个对称矩阵(即从矩阵的左上角到右下角的主对角线为轴,右上角的元与左下角相对应的元全都是相等的)。 因此,在实际存储邻接矩阵时只需存储上(或下)三角矩阵的元素。
2.对于无向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点的度TD(vi),比如顶点v1的度就是1+0+1+0=2.
3.求顶点vi的所有邻接点就是将矩阵中第i行元素扫描一遍,A[i][j]为1就是邻接点。

下图是有向图和它的邻接矩阵:

可以看出:
1.主对角线上数值依然为0。但因为是有向图,所以此矩阵并不对称。
2.有向图讲究入度与出度,顶点v1的入度为1,正好是第v1列各数之和,顶点v1的出度为2,即第v1行的各数之和。
3.与无向图同样的办法,判断顶点vi到vj是否存在弧,只需要查找矩阵中A[i][j]是否为1即可。

通过以上对无向图、有向图和网的描述,可定义出邻接矩阵的存储结构:
#define MaxVertexNum 100; //顶点数目的最大值 typedef char VertexType; //顶点的数据类型 typedef int EdgeType; //带权图中边上权值的数据类型 typedef struct{ VertexType Vex[MaxVertexNum]; //顶点表 EdgeType Edge[MaxVertexNum][MaxVertexNum]; //邻接矩阵,边表 int vexnum, arcnum; //图的当前顶点数和弧树 }MGraph;

二.邻接表
图的邻接表是一种顺序与链式存储相结合的存储方法。在邻接表中有两种类型的结点,一种是头结点,其个数恰好为图中顶点的个数;另一种是边结点,也就是单链表中的结点。对于无向图,这类结点的个数等于边数的两倍;对于有向图,这类结点的个数等于边数。
图的完整邻接表存储类型的声明如下:
typedef struct ANode //边结点; { int adjvex;//指向该边的终点编号; struct ANode*nextarc;//指向下一个邻接点; INfoType info;//保存该边的权值等信息; }ArcNode; typedef struct Vnode //头结点 { int data;//顶点; ArcNode *firstarc;//指向第一个邻接点; }VNode; typedef struct { VNode adjlist[MAX];//邻接表; int n,e;//图中顶点数n和边数e; }AdjGraph;//完整的图邻接表类型


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM