一、图结点之间的关系可以是任意的,图中任意两个元素之间都可能相关。
二、基本定义:
有向图的顶点对是<x,y>;无向图的顶点对是(x,y)。
三、基本术语:
①无向完全图具有n(n-1)/2条边;有向完全图具有n(n-1)条弧。
②带权的图称为网。
③连通分量是指无向图中的极大连通子图
④连通图的生成树是指一个极小连通图,它含有图中全部顶点,但只有足以构成一棵树的n-1条边。
四、图的存储结构之邻接矩阵表示法:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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邻接的下一条边的结点)三个部分。
有时,为了确定顶点的入度,可以建立一个有向图的逆邻接表。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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.迪杰斯特拉算法