第六章学习小结

时间:2021-10-24 01:24:39

(一)邻接表和邻接矩阵

图的存储结构,有邻接矩阵表示法和邻接矩阵表示法两种。

邻接矩阵通过矩阵来存储图的信息,其算法的时间复杂度为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之间的最短路径长度。