大话数据结构——图的再讨论(一)~2020.9.2

返校上课的第一天,从头开始复习图的相关知识。

图的定义

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

①线性表中我们把数据元素叫元素,树中将数据元素叫结点,图中将数据元素称为顶点(Vertexes)。
②在定义中,若V是顶点的集合,则强调了顶点集合V非空。
③在图中,任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集可以为空。

#各种图的定义
1.无向图:若顶点vi和vj之间的边没有方向,则称这条边为无向边,由无向边组成的图称为无向图。
无向边的表示方法:(vi,vj)
2.有向图:vi到vj的边有方向,则称这条边为有向边,亦称弧(Arc)。
有向边的表示方法:<vi,vj>

注:①在图中,若不存在自环且一条边不会重复出现,则称这种图为简单图。
②在无向图中,任意两条边之间都存在边,称无向完全图。无向完全图由 n*(n-1)/2 条边。有向完全图的边数乘二。
③边或弧很少的图叫稀疏图,反之叫稠密图。
④图中的边或弧带权值,则称这种图为网(Network)。

#图中顶点与边的关系
①度
对于无向图G = ( v , { E } ),如果边( v , v’ )∈E,则称v和v’ 互为邻接点(Adjacent),即v和v’相邻接。边( v , v’ )依附于v和v’ 。顶点v的度是和v相关联的边的数目。
对于有向图,以顶点v为头的弧的数目称为v的入度,即为ID;以顶点v为尾的弧的数目称为v的出度,称为OD,v的度即入度与出度的加和。
②路径
树中根结点到任意结点的路径是唯一的,但是图中某顶点到另一顶点的路径不是唯一的。
路径的长度是路径上的边或弧的数目。
第一个顶点和最后一个顶点相同的路径称为回路或环。序列中顶点不重复出现的路径称为简单路径。除了第一个顶点和最后一个顶点之外,其余顶点没有重复的回路,称为简单路径或简单环。

#连通图相关术语
①连通图
在无向图G中,若v到v’有路径,则称二者连通。如果对于图中任意两个路径都是连通的,则称G为连通图。
②连通分量
无向图中的极大连通子图称为连通分量。有向图中,任意一对vi,vj∈V,从vi到vj和从vj到vi都存在路径,则称G是强连通图。有向图中的极大连通子图称为有向图的强连通分量。
③生成树
所谓的一个连通图的生成树,是一个极小的连通子图。它包含了图中的n个顶点,但只有足以构成一棵树的 n-1 条边。

图的存储结构

此处仅详细介绍两种图的存储结构,它们分别叫做邻接矩阵和邻接表,除此之外,在涉及最小生成树的算法中,也将会讲到边集数组这种存储结构。
邻接矩阵
图的邻接矩阵是用两个数组来表示图。一个一维数组存储图中顶点的信息(如:顶点可能存储字符串信息或数值),一个二维数组(称为邻接矩阵)存储图中的边或弧的信息(两个顶点间是否存在路径或直接存储权值)。

邻接矩阵结构定义:

typedef char VertexType;
typedef int EdgeType;
const int MAXVEX = 100;//自定义的最大顶点数,一维数组的上限。
const int INFINITY = 65535;//自定义的无穷大值,用于表示两条边之间不连通
struct MGraph{
 VertexType vexs[MAXVEX];//一维数组存储顶点信息 
 EdgeType arc[MAXVEX][MAXVEX];//一维数组存储边的信息 
 int numVertexes,numEdges;//顶点数目,边的数目 
}; 

邻接矩阵实现:

void CreateMGraph(MGraph *G)
{
 cout<<"输入顶点个数与边的数目:";
 cin>>G->numVertexes>>G->numEdges;
 
 for(int i=0;i<G->numVertexes;i++){
  cout<<"输入第"<<i+1<<"个顶点的信息";
  cin>>G->vexs[i]; 
 }
 for(int i=0;i<G->numVertexes;i++){
  for(int j=0;j<G->numVertexes;j++){
   G->arc[i][j] = INFINITY;
  }
 }
 for(int i=0;i<G->numEdges;i++){
  int j,k,l;
  cout<<"输入边(vi,vj)的下标i,下标j和权w:";
  cin>>j>>k>>l;
  G->arc[j][k] = l;
  G->arc[k][j] = G->arc[j][k];//赋值操作一定不能搞反 
 }
}

以上是今天的内容,之后将会带来剩下的与图相关的算法知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值