图(基本概念及存储结构)

343 阅读3分钟

这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

1.图基本概念

图G由顶点集V和边集E组成(线性表可以是空表,树可以是空树,但图不可以是空图 即图的顶点集一定时非空 E可以为空)

  • 有向图 E为有向边的集合时,图G为有向图。弧是顶点的有序对,记为<v,w>,v,w是顶点,v称为弧尾,w称为弧头
  • 无向图 若E是无向边(简称边)的有限集合时,则图G为无向图 (v,w)=(w,v)
  • 简单图 图G:不存在重复边;不存在顶点到自身的边(一般我们目前看到很多都是简单图)
  • 连通(无向图) 从顶点v到顶点w有路径存在则v和w是连通的

若图中任意两点都是连通的 则为连通图

连通分量(无向图中极大连通子图:连通子图要尽可能包含原图中的边)

极小连图子图:保持图连通且要使得边最少(n个顶点的连通图最少要有n-1条边:因为那就是树)

  • 强连通(有向) 从顶点v到顶点w,且w到v都有路径存在 则v和w是强连通

若图中任意两点都是强连通的 则为强连通图

强连通分量(有向图中极大强连通子图)

  • 生成树

连通图的生成树是包含图中所有顶点的一个极小连通子图

  • 顶点的度 入度 出度

n个顶点 e条边

无向图的度为 边的2倍

有向图的度为 入度和出度之和

2.图的存储结构

2.1 领接矩阵法

如图是无向图和有向图的邻接矩阵

image.png

用一个一维数组存放图中所有顶点数据,用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵

所以领接矩阵的存储结构:(可以看到他的空间复杂度为O(n^2))

  #define MaxVertex 100
  typedef char VertexType; //顶点存储的数据类型为char
  typedef int EdgeType; //带权图边上带的值的类型
  typedef struct{
    VertexType Vertex[MaxVertex]; //顶点表
    EdgeType Edge[MaxVertex][MaxVertex]; //领接存储表
    int vertexNum,edgeNum; //顶点个数和边数
  }Graph;

2.2 领接表法

当存储的图为稀疏图时,使用邻接矩阵法会浪费大量的存储空间,因为玲接表就是不错的选择。那领接表是怎么的 先看图:

image.png

image.png 领接表需要顶点表和边表 则领接表就结合了顺序存储和链式存储 就避免了浪费存储空间

image.png

  #define MaxVertex 100
   typedef char VertexType; //顶点存储的数据类型为char
  typedef int EdgeType; //带权图边上带的值的类型
  typedef struct ArcNode{ /边表结点
   int adjvex;  //结点在数组中下标的位置
   struct ArcNode *next; //指向下一个领接点的指针
  }ArcNode;
  
  typedef struct VertxNode{ //顶点表
    VertexType data;
    ArcNode *fristarc; //指向第一个从该结点出发的指针
  }VertxNode,AdjList[MaxVertex];
  
  typedef struct{
     AdjList verticts; //领接表
     int vertexNum,arcNum; //顶点个数和边数
  }Graph;