數據結構——圖

四、圖

(一)圖的基本概念
    • 圖是一種數據結構,加上一組基本操作,就構成了抽象數據類型。
    • 圖是由結點的有窮集合V和邊的集合E組成的。
    • 圖中將結點叫做頂點,邊是頂點的有序偶對。兩個頂點之間存在一條邊,表示這兩個頂點之間具有相鄰關係。
  1. 有向圖與無向圖
    • 有向圖:每條邊都有方向(圖左)
    • 無向圖:每條邊都沒有方向(圖右)

  2.   在有向圖中,通常將邊稱爲弧,含箭頭的一端稱爲弧頭,另一端稱爲弧尾。記作<Vi,Vj>,它表示從頂點Vi到頂點Vj的一條邊。
  3. 頂點的度,入度,出度
    • 有向圖中
      • 指向頂點V的邊的條數稱爲頂點V的入度
      • 由頂點V發出的邊的條數稱爲頂點V的出度
    • 在無向圖中
        度:與頂點v相關的邊的條數稱爲頂點V的度。
  4. 有向完全圖和無向完全圖
    • 有向完全圖
      • 如果圖有n個頂點,則最多有n(n-1)條邊 ,也就是圖中任意兩個頂點都有兩條邊相連(方向不同),將具有n(n-1)條邊的圖稱爲有向完全圖。
    • 無向完全圖
      • 圖有n個頂點,對最多有n(n-1)/2條邊,也就是任意兩個頂點都有一條邊,將具有n(n-1)/2條邊的圖稱爲無向完全圖。
  5. 路徑和路徑長度
    • 路徑:相鄰頂點序偶(序:有序,偶:一對)構成的序列稱爲路徑,也就是兩個相鄰頂點的邊。
    • 路徑長度:兩個頂點之間路徑上邊的數目。
  6. 簡單路徑:
    • 序列中頂點不重複出現的路徑稱爲簡單路徑。
  7. 迴路
    • 若一條路徑中,第一條頂點和最後一個頂點相同,則這條路徑稱爲迴路。
  8. 連通,連通圖,連通分量,強連通圖,強連通分量
    • 無向圖中
      • 兩頂點之間有路徑,即爲連通
      • 如果圖中任意兩個頂點都連通,則稱爲連通圖
      • 如果不是連通圖,則圖中極大連通子圖稱爲連通分量。
    • 有向圖中
      • 兩頂點之間有路徑,即爲連通
      • 如果圖中任意兩個頂點都連通,則稱爲強連通圖
      • 如果不是強連通圖,則圖中極大強連通子圖稱爲強連通分量。
  9. 權、網
      • 圖中每條邊都附有一個數,這種與邊相關的數稱爲權
      • 權可以表示從一個頂點到一個頂點之間的花費或者代價
      • 邊上帶有權的圖稱爲帶權圖,又稱爲網
  10. 稀疏圖、稠密圖
    • 稀疏圖:有很少邊的叫做稀疏圖
    • 稠密圖:有很多邊的叫做稠密圖
(二)圖的存儲及基本操作
  1. 鄰接矩陣

    • 表示頂點之間關係的矩陣,是圖的順序存儲結構
    • 鄰接表的性質
      • A[i] [j] = 1表示頂點 i 和頂點 j 鄰接,即 i 和 j 直之間存在弧
      • A[i] [j] = 0表示頂點 i 和頂點 j 不鄰接,即 i 和 j 直之間不存在弧
      • 由鄰接矩陣的行數或者列數可知圖中的頂點數。
      • 對於無向圖,鄰接矩陣是對稱的,矩陣中1的個數是圖中邊的個數的兩倍,矩陣中第 i 行或者第 j 列的元素之和即爲頂點 i 的度。
      • 對於有向圖:矩陣中1的個數等於圖的邊數。矩陣中第 i 行的元素之和即爲頂點 i 的出度。第 j 列元素之和即爲頂點 j 的入度。
      • 對於有向有權圖,圖的邊都是有權重的。如果有邊存在,不在寫爲1,而是寫爲其變的權重,若邊不存在,則爲∞,一個比圖中所有的權重都大的數。
  2. 鄰接表法

    • 鄰接表法是圖的鏈式存儲結構

    • 鄰接表法:對圖中的每個頂點建立一個單鏈表,每個單鏈表的第一個結點存放有關頂點的信息,把這一個結點看作鏈表的表頭,其餘結點存放有關邊的信息。下面是無向圖的鄰接表和有向圖的鄰接表
      [外鏈圖片轉存失敗(img-OM3lSBfm-1566478047921)(C:\Users\DONG\AppData\Roaming\Typora\typora-user-images\1566215244542.png)]
      [外鏈圖片轉存失敗(img-0s0MMLAy-1566478047937)(C:\Users\DONG\AppData\Roaming\Typora\typora-user-images\1566215317670.png)]

    • 如圖可知,鄰接表是由單鏈表的表頭形成的頂點表和單鏈表其餘結點形成的邊表兩部分組成。

    • 頂點表 存放 頂點信息指向第一個邊結點的指針

    • 邊表結點存放與當前頂點相鄰接頂點的序號和當前結點指向下一個邊結點的指針。

  3. 有向圖的十字鏈表

    • 十字鏈表是有向圖的另一種鏈式存儲結構,該結構可以看成是將有向圖的鄰接表和逆鄰接表結合起來得到的。

    • 十字鏈表結構如下

      [外鏈圖片轉存失敗(img-diS7e0qe-1566478047937)(C:\Users\DONG\AppData\Roaming\Typora\typora-user-images\1566217102023.png)]

      • vertex:存放頂點信息
      • firstin:存放 入邊 表頭 指針,指向該頂點的入邊表中第一個結點。
      • firstout:表示出邊 表頭 指針,指向該頂點的出邊表中第一個結點。

      [外鏈圖片轉存失敗(img-Uj2kmiQa-1566478047942)(C:\Users\DONG\AppData\Roaming\Typora\typora-user-images\1566217128381.png)]

      • hlink:指入邊表指針域,指向終點相同的下一條邊。
      • tlink:指出邊表指針域,指向起點相同的下一條邊。
    • 下圖是省略了info的十字鏈表

      [外鏈圖片轉存失敗(img-1uRSQkEG-1566478047944)(C:\Users\DONG\AppData\Roaming\Typora\typora-user-images\1566217693161.png)]

  4. 無向圖的鄰接多重表

    • 鄰接多重表是無向圖的另一種鏈式存儲結構。可以看作是鄰接表和十字鏈表的結合。

    • 鄰接多重表結構如下:

      - [外鏈圖片轉存失敗(img-TK2bja5V-1566478047945)(C:\Users\DONG\AppData\Roaming\Typora\typora-user-images\1566218800170.png)]

      • data:存儲此頂點的數據

      • firstedge:用於存儲同該頂點有直接關聯的存儲其他頂點的結點

      • [外鏈圖片轉存失敗(img-mwVADbjI-1566478047947)(C:\Users\DONG\AppData\Roaming\Typora\typora-user-images\1566218927103.png)]

        • mark:標誌域,標誌該條邊是否被搜索過
        • ivex和jvex:數據域,爲該邊依附的兩個頂點在圖中的位置,也就是所在數組的下標.
        • ilink:指針域,指向下一個存儲與 ivex 有直接關聯頂點的結點;
        • jlink:指針域,指向下一個存儲與 jvex 有直接關聯頂點的結點;
        • info:指針域,用於存儲與該頂點有關的其他信息,比如無向網中各邊的權;

        [外鏈圖片轉存失敗(img-2OsdNI7M-1566478047951)(C:\Users\DONG\AppData\Roaming\Typora\typora-user-images\1566219376709.png)]

(三)圖的遍歷
  1. 深度優先搜索遍歷(DFS)
    • 圖的深度優先搜索遍歷相當於二叉樹的先序遍歷。
    • 基本思想:首先訪問一個結點V,標記其爲已訪問;然後選取與V鄰接的未被訪問的任意一個結點W,並標記爲已訪問;再選取與W鄰接的未被訪問的任意一個結點,依次類推。
  2. 廣度優先搜索遍歷(BFS)
    • 圖的廣度優先搜索遍歷相當於二叉樹的層次遍歷。
    • 基本思想:首先先對一個頂點V進行訪問,將其標記爲已訪問,然後訪問與V相鄰接的所有的結點,W1,W2…然後再依次訪問W1,W2…的所有的結點相鄰接的所有的結點,以此類推。
(四)圖的基本應用

下面是圖的基本應用,一些算法都比較重要,但是又不容易理解,下面只是寫出了其基本思想,具體的實現步驟或者一些案例,可以自行查找。這裏主要目的是根據大概思想,回想其大概步驟的,看自身掌握情況的。

  1. 最小(代價)生成樹
    • 普里姆算法
      • 基本思想:從圖中任意取出一個頂點,把它當成一棵樹,然後從其相連的邊中選出一條最短的路徑(權值最小),並將該邊以及所連接的頂點併入樹中,此時得到一棵有兩個頂點的樹。然後再從這棵樹相鄰的邊種選取一條最短的邊,依次類推。直到圖中的頂點全部併入樹中。
      • 普里姆算法的時間複雜度只與圖中的頂點有關係,與邊數沒有關係,因此普里姆算法適用於稠密圖。
    • 克魯斯卡爾算法
      • 算法思想:每次找出侯選邊中權值最小的邊,並檢測當前邊是否爲侯選邊,是否改變會構成迴路,如不構成迴路,就將該邊併入生成樹中。重複此過程,直到所有邊都被檢測完爲止。
      • 克魯斯卡爾算法時間複雜度由圖中的邊數決定,與頂點數無關,因此適用於稀疏圖。
  2. 最短路徑
    • 迪傑斯特拉算法
      • 主要用於求圖中某一個頂點到其餘的頂點的最短路徑。
      • 基本思想: 設兩個頂點集合 S,T,集合S 中存放圖中已找到的最短路徑的頂點。集合T中存放圖中剩餘頂點。初始狀態時,集合S 中只包含源點V0,然後不斷的從T中選取 到源點V0最短的路徑長度V1,併入集合S中。集合S 每入一個頂點,都要修改V0到集合T中頂點的最短路徑長度值。不斷重複此過程。
    • 弗洛伊德算法
      • 主要用於計算圖中任意兩個頂點間的最短路徑
      • 基本思想:設置兩個矩陣A和PATH,A用來記錄已經求得的任意兩個頂點最短路徑長度,PATH用來記錄當前兩頂點減最短路徑上要經過的中間頂點。然後依次選取中間點(k),檢測所有頂點對,如果A[i] [j] > A[i] [k] +A[K] [j] 則將A[i] [j] 改成A[i] [k] +A[K] [j] 的值,也就是取小的值。依次類推,最後得到的的二位數組裏面就是任意兩個頂點的最短距離。
  3. 拓撲排序
    • AOV網:頂點表示活動邊表示頂點間的先後次序,且沒有迴路的有向圖稱頂點表示活動的網(AOV)
    • 有向無環圖:一個有向圖中不存在環,則稱爲有向無環圖,簡稱DAG圖.
    • 拓撲排序:對一個有向無環圖G進行拓撲排序,將G中的所有頂點排成一個線性序列,使圖中任意一對頂點u,v,如果存在路徑,則一定u再v之前。
    • 基本思想:
      • 從有向圖中選擇一個沒有前驅(入度爲0)的頂點輸出
      • 刪除該頂點,並且刪除該頂點發出的所有的邊
      • 重複上面兩個步驟,直到剩餘的圖中不存在沒有前驅的頂點爲止。
    • 拓撲排序的序列不唯一
  4. 逆拓撲排序
    • 基本思想:
      • 從有向圖中選擇一個沒有後繼(出度爲0)的頂點輸出
      • 刪除該頂點,並且刪除到達該頂點的所有的邊
      • 重複上面兩個步驟,直到剩餘的圖中不存在沒有後繼(出度爲0)的頂點爲止。
  5. 關鍵路徑
    • AOE網:邊表示活動,邊有權值,代表活動持續時間;頂點表示事件,事件是圖中新活動開始舊活動結束的標誌的有向無環圖稱爲AOE網。
    • AOE網只存在一個入度爲0的頂點,稱爲源點,表示整個工程的開始;只存在一個出度爲0的頂點,稱爲匯點,表示整個工程的結束。
    • 關鍵路徑:在AOE網中,從源點到匯點的所有路徑中,具有最大路徑長度的路徑稱爲關鍵路徑。
    • 關鍵路徑長度:完成整個工程的最短時間就是關鍵路徑長度所代表的時間。
    • 關鍵活動:關鍵路徑上的活動稱爲關鍵活動。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章