【數據結構】圖論基礎

待完善。。。

目錄

 

圖的遍歷

最小代價生成樹(無向圖)

最短路徑(有向圖)


  • 圖的遍歷

    • DFS圖的深度優先搜索遍歷
      • 基本思想:
        • 1⃣️首先訪問出發點v,並將其標記爲訪問過
        • 2⃣️然後選取與v鄰接的沒有訪問過的任意一個頂點w,並訪問它
        • 3⃣️再選取與w鄰接的沒訪問過的頂點訪問,重複上述動作,直到所有頂點被訪問過。
      • PS:
        • 需要一個visit[]數組,用來作爲頂點的訪問標記

           

    • BFS圖的廣度優先搜索遍歷
      • 基本思想:
        • 1⃣️首先訪問起始頂點v
        • 2⃣️然後選取與v鄰接的全部頂點w1 w2 ... wn 進行訪問
        • 3⃣️再依次訪問與w1 w2 ... wn鄰接的全部頂點,重複動作,直到所有頂點被訪問過。
      • PS:
        • 需要一個隊列,用來存放頂點的全部未被訪問過的鄰接頂點p = p -> nextarc;(鄰接表)
        • 隊列爲空的時候跳出循環

           

  • 最小代價生成樹(無向圖)

    • 普里姆算法Prim
      • 算法思想
        • 1⃣️任意取出一個頂點,把它當成一棵樹,
        • 2⃣️然後從與這棵樹鄰接的邊中挑一條最短的邊,並將這條邊所連接的頂點加入這棵樹
        • 3⃣️然後再找一條與這棵樹鄰接的一條最短的邊,重複上述動作,直至所有頂點加入樹中
      • 算法執行過程中的關鍵理解點
        • 兩個數組,vset[]和lowcost[],vset[i]]=1表示頂點i已經加入樹中。lowcost[i]保存當前生成樹到頂點i的最短一條邊的權值
      • 複雜度分析
        • n^2
        • 適用於稠密圖。無向圖。
    • 克魯斯卡爾Kruskal
      • 算法思想
        • 1⃣️用每次找出候選邊權值最小的邊,併入生成樹中
        • 2⃣️重複上述動作,直至所有邊都檢測完畢。
      • 算法執行過程中的關鍵理解點
        • 圖中所有邊按照權值大小排序sort()
        • 🌟從最小的邊開始掃描,檢測是否爲候選邊(該邊加入不會形成迴路),是,併入。
        • 關於迴路問題【並查集】,一棵或者幾顆樹,找媽媽(root節點)媽媽一樣就是一家子(一個集合)。
      • 複雜度分析
        • 取決於排序算法的複雜度。規模由圖的邊數e決定
        • 適用於稀疏圖。無向圖。
  • 最短路徑(有向圖)

    • 迪傑斯特拉算法Dijkstra
      • 求圖中某頂點到其餘頂點的最短路徑
      • 算法思想
        • 設兩個集合S,T。S存放已經找到的最短路徑的頂點,T存放剩餘頂點。
        • 找v0到集合T中的所有頂點路徑最短的點Vu加入S中。
        • 🌟每併入一個頂點,都要更新v0到T集合中剩餘頂點的最短路徑長度。
        • 不斷重複上述動作,直至所有節點併入S中。
      • 執行過程
        • 引入3個數組,dist[],path[]和set[]數組。
        • dist[]:當前已經找到的v0:奧vi的最短路徑的長度。初態:有邊就是邊的權值,無邊dist[vi] = ∞
        • Path[]:保存從v0到vi最短路徑的前一個頂點。初態爲:v0到vi有邊,path[vi] = v0,否則path[vi] = -1 。本體就是-1。path保存的是一棵樹,一顆雙親存儲結構存儲的樹。藉助棧,可以直接輸出葉子到根路徑上的節點。
        • Set[]:標記數組,set[vi] = 0 表示vi在T中,未併入S。初態:set[vo] = 1,其餘全爲0 。
      • 複雜度
        • n^2
    • 弗洛伊德算法Floyd
      • 求任意一對頂點間的最短路徑
      • 算法思想
      • 執行過程
      • 複雜度
        • n^3

    mindmap

  • mindmap

     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章