第六章学习小结

      本章学习了图的结构及应用,

      首先是图的分类,图分为无向图、有向图、完全图、连通图、强连通图、带权图、稀疏图、稠密图等等。

      图的存储方式有两大类,以边集合方式的表示法和以链接方式的表示法。其中,以边集合方式表示的为邻接矩阵(借助二维数组来表示元素之间的关系,实现较为简单),以链接方式表示的包括邻接表、十字链表和邻接多重表(属于链式存储结构,实现较为复杂)。

      接下来是图的遍历算法,图的遍历算法有两种,包括深度优先搜索遍历和广度优先搜索遍历。

      深度优先搜索遍历类似于树的先序遍历,借助于栈结构来实现。

void DFS(Graph a,int b) //深度优先搜索 
  {
      visited[b]=true;    //令顶点对应的visited数组为true,表示该顶点已被访问过 
      cout<<b<<" ";   //输出顶点编号及空格 
       
      for(int i=0;i<a.vexnum;i++)
      {
          if(a.arcs[b][i]==1 && visited[i]==false)DFS(a,i);   //若顶点对应的邻接点未被访问,则递归调用DFS函数 
      }
 }
DNF

      广度优先搜索遍历类似于树的层次遍历,借助队列结构来实现。

void BFS(Graph a,int b) //广度优先搜索 
 {
      int temp;   //定义参数 
       
      while(!q.empty())   //若队列不为空 
      {
          temp=q.front(); //取队头元素值为temp 
        q.pop();    //队头元素出队 
               
         cout<<temp<<" ";    //输出temp值及空格 
      
         for(int i=0;i<a.vexnum;i++)
         {
             if(a.arcs[temp][i]==1 && visited[i]==false) //若顶点对应的邻接点未被访问,则邻接点入队 
             {
                 q.push(i);  //邻接点入队 
                 visited[i]=true;    //邻接点对应的visited数组取true,表示已被访问 
             }
         }
     visited[b]=true;    //第一次入队的顶点对应的visited数组值取true,表示已被访问
     }
 }
BFS

      然后是图的应用,比较常用的包括构造最小生成树算法、求解最短路径算法

      构造最小生成树的算法有普里姆算法和克鲁卡斯算法,其中

      普里姆算法的核心是归并点,时间复杂度是O(n2),适用于稠密网

      克鲁斯卡尔算法是归并变,时间复杂度是O(elog2e),适用于稀疏网。

      最短路径算法包括迪杰斯特拉算法和弗洛伊德算法,其中

      迪杰斯拉特算法是求从某个源点到其余各顶点的最短路径,按路径长度递增的次序产生最短路径,时间复杂度为O(n2)

      弗洛伊德算法是求每一对顶点之间的最短路径,时间复杂度为O(n3)

      个人感觉图这一章概念很多,算法也很多,要多花时间看书,弄懂书上的概念和算法。

 

posted @ 2019-05-19 23:24  kwli  阅读(221)  评论(1编辑  收藏  举报