数据结构--7.图

本文详细介绍了图的定义,包括无向图、有向图、连通图等概念,并探讨了图的两种主要存储结构——邻接矩阵和邻接表。接着,文章阐述了图的遍历方法,如深度优先遍历和广度优先遍历。此外,还讨论了图的最小生成树问题,提出了普里姆算法。最后,文章提及了最短路径的迪杰拉斯特算法及其工作原理。
摘要由CSDN通过智能技术生成

7、图

7.1图的定义

图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。

无向边:若顶点vi到vj之间的边没有方向,则称这条边为无向边(Edge),用无序偶对(vi,vj)来表示。如果图中任意两个顶点之间的边都是无向边,则称该图为无向图(Undirected graphs)

有向边:若从顶点vi到vj的边有方向,则称为弧(Arc)。用有序偶<vi,vj>来表示,vi称为弧尾(Tail),vj称为弧头(Head)。如果图中任意两个顶点之间的边都是有向边,则称该图为有向图(Directed graphs)

在图中,若不存在顶点到其自身的边,且同一条边不重复出现,则称这样的图为简单图

在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。含有n个顶点的无向完全图有n(n-1)/2条边

在有向图中,如果任意两个顶点之间都存在方向互为相反的两条弧,则称该图为有向完全图。含有n个顶点的无向完全图有n(n-1)条边

有很少条边或弧的图称为稀疏图,反之称为稠密图

与图的边或弧有关的数叫做权(Weight),带权的图通常称为网(NetWork)

假设有两个图G=(V,{E}),G’=(V’,{E’}),如果V‘⊆V,E’⊆E,则称G’为G的子图

图的顶点与边间关系

对于无向图G=(V,{E}),如果边(v,v’)∈E,则称顶点v和v‘互为邻接点(Adjacent),即v和v’相邻接。边(v,v’)依附(incident)于顶点v和v’,或者说(v,v’)与顶点v和v’相关联。顶点v的度(Degree)是和v相关联的边的数目,记为TD(v)。

对于有向图G=(V,{E}),如果弧<v,v’>∈E,则称顶点v邻接到顶点V’,顶点v’邻接自顶点v。弧<v,v’>和顶点v,v’相关联。以顶点v为头的弧的数目称为v的入度(InDegree),记为ID(v);以v为尾的弧的数目称为v的出度(OutDegree),记为OD(v);顶点v的度TD(v)=ID(v)+OD(v)。

路径的长度是路径上的边或弧的数目

第一个顶点到最后一个顶点相同的路径称为回路或环(Cycle)。序列中顶点不重复出现的路径称为简单路径。除了第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路,称为简单回路或简单环。

连通图相关术语

在无向图G中,如果从顶点v到顶点v’有路径,则称v和v‘是连通的。如果对于图中任意两个顶点vi,vj∈E,vi和vj都是连通的,则称G是连通图(Connected Graph)。

无向图中的极大连通子图称为连通分量,注意

  • 要是子图
  • 子图要是连通的
  • 连通子图含有极大顶点数
  • 具有极大顶点数的连通子图包含依附于这些顶点的所有边

在有向图G中,如果对于每一对vi,vj∈V、v1≠vj,从vi到vj和从vj到vi都存在路径,则称G是强连通图。有向图中的极大强连通子图称做有向图的强连通分量。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.2图的抽象数据类型

ADT	图(Graph)
Data
	顶点的有穷非空集合和边的集合。
Operation
	CreateGraph(*G,V,VR):按照顶点集V和边弧集VR的定义构造图G。
	DestroyGraph(*G):图G存在则销毁。
	LocateVex(G,u):若图G中存在顶点u,则返回图中的位置
	GetVex(G,v):返回图G中项点v的值。
	PutVex(G,v,value):将图G中顶点v赋值value。
	FirstAdjVex(G,*v):返回顶点v的一个邻接顶点,若项点在G中无邻接顶点返回空。
	NextAdjVex(G,v,*w):返回顶点v相对于顶点w的下一个邻接顶点,若w是v的最后
一个邻接点则返回“空”。
	InsertVex(*G,v):在图G中增添新顶点V。
	DeleteVex(*G,v):删除图G中顶点V及其相关的弧。
	InsertArc(*G,v,w):在图G中增添弧<v,w>,若G是无向图,还需要增添对称弧<w,v>DeleteArc(*G,v,w):在图G中删除弧<v,w>,若G是无向图,则还删除对称孤
<w,v>DFSTraverse(G):对图G中进行深度优先遍历,在遍历过程对每个顶点调用。
	HFSTraverse(G):对图G中进行广度优先遍历,在遍历过程对每个顶点调用。
endADT

7.3图的存储结构

邻接矩阵

图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。

在这里插入图片描述
在这里插入图片描述

图的邻接矩阵存储结构代码

typedef char VertexType;/*顶点类型应由用户定义*/
typedef int EdgeType;/*边上的权值类型应由用户定义*/
#define MAXVEX 100/*最大顶点数,应由用户定义*/
#define INFINITY 65535/*用65535来代表00*/
typedef struct
{
   
    VertexType vexs[MAXVEX];/*顶点表*/
    EdgeType arc [MAXVEX] [MAXVEX]; /* 邻接矩阵,可看作边表 */
	int numVertexes,numEdges;/*图中当前的顶点数和边数*/
}MGraph;

无向网图创建代码

//建立无向网图的邻接矩阵表示
void CreateMGraph(MGraph *G)
{
   
    int i,j,k,w;
    printf("输入顶点数和边数:\n");
    scanf("%d,%d",&G->numVertexts,&G->numEdges);//输入顶点数和边数
    for(i=0;i<G->numVertexts;i++)	//输入顶点信息,建立顶点表
        scanf(&G->vexs[i]);
    for(i=0;i<G->numVertexts;i++)
        for(j=0;j<</
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值