数据结构之图(邻接矩阵、邻接表、邻接多重表、十字链表;深度优先搜索、广度优先搜素;最短路径、关键路径、拓扑排序、最小生成树)

一、图的知识框架

在这里插入图片描述

二、图的定义

:图G由顶点集V和边集E组成,记为G=(V,E),其中V(G)表示图G中顶点的有限非空集;E(G)表示图G中顶点之间的关系(边)的集合。

1.有向图
若E是有向边(简称弧)的有限集合时,则G为有向图。弧是顶点的有序对,记为<v,w>,其中 v,w 是顶点,v 是弧尾,w 是弧头。称为从顶点v到顶点w的弧。
在这里插入图片描述
G1可表示为:
G=(V,E)
V={1,2,3}
E={<1,2>, <2,1>, <2,3>}

2.无向图
若E是无向边(简称边)的有限集合时,则G为无向图。边是顶点的无序对,记为 (v,w) 或(w,v) ,且有 (v,w) =(w,v) 。其中 v,w 是顶点。
在这里插入图片描述
G2可表示为:
G=(V, E)
V={1,2,3,4}
E={(1,2), (1,3), (1,4), (2,3), (2,4), (3,4)}

3.简单图和多重图
简单图满足以下两条内容:
1)不存在重复边
2)不存在顶点到自身的边
所以上面的有向图和无向图都是简单图。与简单图相对的是多重图,即:两个结点直接边数多于一条,又允许顶点通过同一条边与自己关联。

4.完全图
无向图中任意两点之间都存在边,称为无向完全图;
在这里插入图片描述
有向图中任意两点之间都存在方向向反的两条弧,称为有向完全图;
在这里插入图片描述
5.子图
若有两个图G=(V,E),G1=(V1,E2),若V1是V的子集且E2是E的子集,称G1是G的子图。
图中G3是G1的子图。
在这里插入图片描述
在这里插入图片描述
6.连通、连通图、连通分量
在无向图中,两顶点有路径存在,就称为连通的。若图中任意两顶点都连通,同此图为连通图,否则为非连通图。无向图中的极大连通子图称为连通分量。
在这里插入图片描述
7.强连通图、强连通分量
在有向图中,从顶点v到顶点w和从顶点w到顶点v之间都有路径,则称这两个顶点是强连通。若任一对顶点都是强连通的,称为强连通。有向图中极大强连通子图为有向图的强连通分量。
在这里插入图片描述
G1的强连通分量:
在这里插入图片描述
8.生成树和生成森林
连通图的生成树是包含图中全部顶点的一个极小连通子图,若图中有n个顶点,则生成树有n-1条边。所以对于生成树而言,若砍去一条边,就会变成非连通图。在非连通图中,连通分量的生成树构成了非连通图的生成森林。
在这里插入图片描述
G2的生成树:
在这里插入图片描述
9.顶点的度、入度和出度
顶点的度:以该顶点为一个端点的边的数目。
对于无向图,顶点的边数为度,度数之和是顶点边数的两倍。
对于有向图,入度是以顶点为终点,出度相反。有向图的全部顶点入度之和=出度之和=边数。顶点的度等于入度与出度之和。
注意:入度与出度是针对有向图来说的。

10.边的权和网
图中每条边上标有某种含义的数值,该数值称为该边的权值。
这种图称为带树图,也称作网。

11.路径、路径长度和回路
两顶点之间的路径指顶点之间经过的顶点序列,经过路径上边的数目称为路径长度。若有n个顶点,且边数大于n-1,此图一定有环。

12.简单路径、简单回路
顶点不重复出现的路径称为简单路径。
除第一个顶点和最后一个顶点外,其余顶点不重复出现的回路称为简单回路。

13.距离
若两顶点存在路径,其中最短路径长度为距离。

14.稠密图、稀疏图
稠密图:边数很少的图;反之为稠密图。

15.有向树
有一个顶点的入度为0,其余顶点的入度均为1的有向图称作有向树。如下图:
在这里插入图片描述

三、图的存储

1.图的存储结构概述
对于图G=(V, E)来说,可以有两种标准的表示方法,一个是邻接矩阵,另一个是邻接链表,这两种方法都可以表示有向图和无向图。除此之外,图的存储结构还有十字链表、邻接多重表、边集数组等。

2.邻接矩阵法

(1)邻接矩阵:用两个数组来表示一个图,一个一维数组用来存储每个顶点的信息;一个二维数组(即邻接矩阵)用来存储图中的边或弧信息。对于图G =(V, E)来说,邻接矩阵matrix是一个|V|*|V|的方阵,假设1 <= i, j <= |V|,如果matrix[i][j] == 0,则表示顶点i和顶点j之间没有边相连;反之,如果matrix[i][j] != 0,则表示表示顶点i和顶点j之间有边相连,且matrix[i][j]存储的值即为该边的权重。

无权值图:
在这里插入图片描述
带权图:
在这里插入图片描述
有向图、无向图和网对应的邻接矩阵案例:
在这里插入图片描述
(2)图的邻接矩阵存储结构

#define Maximum 1000
typedef int VexType;
typedef int EdgeType;

typedef struct {
   
    VexType Vex[Maximum];
    EdgeType Edge[Maximum][Maximum];
    int vexnum;
    int arcnum;
}MGragh;

(3)图的邻接矩阵存储表示的特点
在这里插入图片描述
3.邻接表法

(1)邻接表:邻接链表是一种不错的图存储结构,由于它在表示稀疏图的时候非常紧凑而成为通常的选择。对于图G =(V, E)来说,在其邻接链表表示中,每个结点对应一条链表,因此这个图里有V条链表。假设用一个V维的数组Adj来存储这V条链表,且Adj[i]表示的是结点i对应的链表,那么Adj[i]这条链表里存储的就是所有与节点i之间有边相连的结点,即与结点i相邻的结点。
邻接表中存在两种结点:顶点表结点和边表结点
在这里插入图片描述
无向图和有向图的邻接表的实例:
在这里插入图片描述
在这里插入图片描述
(2)图的邻接表存储结构定义:

#define Maximum 1000

typedef struct ArcNode{
   
    int adjvex;
    int weight;//权值
    ArcNode* next;
}ArcNode;

typedef struct VNode{
   
    int data;
    ArcNode* first;
}VNode,AdjList[Maxinum];

typedef struct ALGragh{
   
    AdjList vertices;
    int arcnum,vernum;
}ALGragh;

(3)图的邻接表存储方法的特点:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值