第六章学习小结

一、图结点之间的关系可以是任意的,图中任意两个元素之间都可能相关。

二、基本定义:

  有向图的顶点对是;无向图的顶点对是(x,y)

三、基本术语:

  ①无向完全图具有n(n-1)/2条边;有向完全图具有n(n-1)条弧。

  ②带权的图称为网。

  ③连通分量是指无向图中的极大连通子图

  连通图的生成树是指一个极小连通图,它含有图中全部顶点,但只有足以构成一棵树的n-1条边。

四、图的存储结构之邻接矩阵表示法:  

 1 #define MaxInt 32767
 2 #define MVNum 100
 3 typedef char VerTexType;//顶点的类型 
 4 typedef int ArcType;//边的类型 
 5 typedef struct
 6 {
 7     VerTexType vexs[MVNum];//顶点表 
 8     ArcType arcs[MVNum][MVNum];//邻接矩阵(必初始化为最大值MaxInt)
 9     int vexnum, arcnum;//当前图的点的数量和边的数量 
10  } AMGGraph; 
图的邻接矩阵的储存表示

优点:便于计算各个顶点之间是否有边、是否有度。

缺点:①不便于增加和删除顶点②不便于统计边的数目,需要扫描邻接矩阵所有的元素才能统计完毕,时间复杂度为O(n2)。③空间复杂度高

五、图的存储结构之邻接表表示法:

  邻接表是链式存储结构,在邻接表中,对图中每个顶点vi建立一个单链表并把与vi相邻接的顶点放在这个链表中。其中所有的表头结点以顺序结构的形式存储,一边可以随机访问任一顶点的边链表。表头结点包括数据域(data)和链域(firstarc)两个部分。边表中的边结点包括邻接点域(adjvex用来指示与顶点vi临接的点在图中的位置)、数据域(info存储和边相关的信息,如权值等)和链域(nextarc指示与顶点vi邻接的下一条边的结点)三个部分。

  有时,为了确定顶点的入度,可以建立一个有向图的逆邻接表。

 

 1 #define MVNum 100
 2 typedef int OtherInfo
 3 typedef struct  ArcNode //边结点 
 4 {
 5     int adjvex;//该边所指向的顶点的位置 
 6     OtherInfo info; //和边相关的信息 
 7     struct ArcNode *nextarc;//指向下一条边的指针
 8 } ArcNode;
 9 typedef struct VNode  //顶点信息 
10 {
11     VerTexType data;// 
12     ArcNode *firstarc; //指向第一条依附该顶点的边的指针
13  } VNode, AdjList[MVNum];//Adjlist表示邻接表类型 
14 typedef struct
15 {
16     AdjList vertices;
17     int vexnum, arcnum;//图的当前顶点数和边的数量 
18  } ALGraph;
图的邻接表的存储表示的方法

 

优点:

①便于删除和增加点的数目

②便于统计边的数目,时间复杂度:O(n+e)

③空间效率高

缺点:

①不便于判断顶点之间是否有边,时间复杂度O(n+e)

②不便于计算各个顶点的度(不像无向图,还要计算出度、入度)。

六、图的遍历之DFS(深度优先算法):

  从某个顶点v出发,访问v。找出刚访问过的顶点的第一个未被访问的邻接点,访问该结点,以该结点为新顶点。重复此步骤,直至刚访问过的顶点没有未被访问过的邻接点为止。返回前一个仍有未被访问过的邻接点的顶点,找出该顶点的下一个未被访问的邻接点,访问该结点。

七、图的遍历之BFS(广度优先算法):

  先从图中某个顶点v出发,访问v。依次访问v的各个未曾访问过的邻接点。分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”限于“后被访问的顶点的邻接点”被访问。重复此步骤。直至所有已被访问的顶点的邻接点都被访问到。(类似树的层次遍历)

八、图的应用之最小生成树(最小生成树其实是最小权重生成树的简称):

1.普利姆算法

 

2.克鲁斯卡尔算法

九、图的应用之最短路径:

1.迪杰斯特拉算法

 

你可能感兴趣的:(第六章学习小结)