前言
数据结构中的有关图的内容应用领域比较广泛,涉及到的知识点也比较多,从图的基本知识点、存储结构、图的遍历、最小生成树算法、最短路径算法、拓扑排序解决有向无环图问题以及关键路径确定等内容研究图的有关知识和应用方面。
基本知识
- 图的定义
- 弧、弧尾、弧头
- 带权图、有向图、无向图
- 完全图
- 简单图、稀疏图、稠密图
- 权、网、路径、邻接点
- 连通图、强连通图、弱连通图
抽象数据类型
ADT Graph{
D
//顶点的有穷非空集合
S
//边的有穷集合
P
/*
创建与销毁 CreateGraph、DestoryGraph
定位顶点LocateVex、查找顶点值GetVex、顶点赋值PutVex
取第一个邻接点FirstAdjVex、取下一个邻接点NextAdjVex
顶点的插入与删除 InsertVex、DeleteVex
边或弧的插入与删除 InsertArc、DeleteArc
深度、广度优先遍历 DFSTraverse、BFSTraverse
*/
} end ADT
存储类型
图的存储类型有多个:邻接矩阵、邻接表、邻接多重矩阵、十字链表、边集数组。
文章中关于存储类型的代码展示主要是包括邻接矩阵和邻接表。
(带权的)邻接链表存储方式
#include<iostream>
#define Maxsize 10
using namespace std;
typedef char VertexType;
typedef int EdgeType;
//定义一个带权图中的结点结构体类型
typedef struct Node{
int adjvex;//顶点编号 有向图中的弧头顶点
EdgeType weight;//此边对应的权值
struct Node *next;//相同弧尾的下一条边
}EdgeNode;
//定义一个邻接表表头的结构体类型
typedef struct{
VertexType data;//数据域
EdgeNode *firstEdge;//存放指向邻接链表第一个结点的地址的指针
}VertexNode,ADJList[Maxsize];//ADJList表示这种邻接表结构体类型的集合
//邻接表表示图的集合
typedef struct{
ADJList adjLists;//含边信息的顶点集合
int numVertex,numEdge;//顶点的数目 边的数目
}GraphADJList;
图的邻接矩阵存储方式
#include<iostream>
#define Maxsize 10
using namespace std;
typedef char VertexType;
typedef int EdgeType;
//定义图的邻接矩阵存储表示的结构体类型
typedef struct{
VertexType Vexs[Maxsize];//图的顶点集合
EdgeType Edges[Maxsize][Maxsize];//图的边集合
int numVertex,numEdge;//图的顶点数 边数
}GraphAMatrix;
由于最常用的是上两种图的存储方式,因此邻接多重链表、十字链表、边集数组等存储方式不罗列,下图分别说明各种存储方式的优劣处对比:
图的遍历
这里图的遍历会给出两种不同存储结构的DFS(深度优先搜索)和BFS(广度优先搜索)的程序展示。
原算法博客地址:https://blog.csdn.net/Gerald_Jones/article/details/80158868
最小生成树问题
这里会给出两种不同的算法prim算法和kruskal算法以及程序的展示。
原算法博客地址:https://blog.csdn.net/Gerald_Jones/article/details/80181297
最短路径问题
这里会给出Dijkstral算法和Floyd算法以及其他的一些求取最短路径的算法程序的展示。
原算法博客地址:https://blog.csdn.net/Gerald_Jones/article/details/85604412
关键路径问题
如果后续博主有空闲时间,会对关键路径的AOE网进行详细的分析总结。