(一)邻接表和邻接矩阵
图的存储结构,有邻接矩阵表示法和邻接矩阵表示法两种。
邻接矩阵通过矩阵来存储图的信息,其算法的时间复杂度为O(n^2);邻接表通过链式存储结构来存储图的信息,其算法的时间复杂度为O(n+e);因为邻接矩阵表示法不便于增加和删除顶点,空间效率低,所以相对于邻接表而言,邻接矩阵更适合用于稠密图,而稀疏图更适合用于邻接表。
采用邻接矩阵表示法,创建无向网 Status CreateUDN(AMGraph &G) //G.vexnum:总顶点数;G.arcnum:总边数;MaxInt:极大值 { cin>>G.vexnum>>G.arcnum; //输入总顶点数,总边数 for(i=0;i<G.vexnum;++i) cin>>G.vexs[i]; //依次输入点的信息 for(i=0;i<G.vexnum;++i) for(j=0;j<G.vexnum;++j) G.arcs[i][j] = MaxInt; //初始化,权值都置为极大值MaxInt for(k=0;k<G.arcnum;++k) { cin>>v1>>v2>>w; i=LocateVex(G,v1);j=LocateVex(G,v2); //确定v1和v2在矩阵中的位置,既顶点数组的下标 G.arcs[i][j] = w; G.arcs[j][i] = G.arcs[i][j]; } return OK; }
图的邻接表存储方式 #define MVNum 100 //最大顶点数 typedef struct ArcNode //边结点 { int adjvex; //该边所指向的顶点的位置 struct ArcNode *nextarc; //指向下一条边的指针 OtherInfo info; //和边相关的信息 } ArcNode; typedef struct VNode { VERtexType data; ArcNode *firstarc; }VNode,AdjList[MVNum]; typedef struct { ADjList vertics; int vexnum, arcnum; //图当前顶点数和边数 }SLGrapg;
(二)图的遍历
深度优先搜索(Depth First Search,DFS)遍历类似于树的先序遍历,是树先序遍历的推广。
广度优先搜索(Breadth First Search,BFS)遍历类似于树的按层次遍历的过程。
(三)最小生成树
图G的生成树是:包含G的全部顶点的极小连通子图。最小生成树的边数=图的顶点数-1。
最小生成树的算法有普里姆算法和克鲁斯卡尔算法两种。
普里姆算法:时间复杂度O(n^2),适用于稠密图
克鲁斯卡尔算法:时间复杂度O(Elog2e),适用于稀疏图
(四)最短路径的算法
算法的实现主要的难点在于需要引入辅助的数据结构。
(1)二维数组Path[i][j]:最短路径上顶点vj的前一顶点的序号。
(2)二维数组D[i][j]:记录顶点vi和vj之间的最短路径长度。