1. 程式人生 > >【資料結構與演算法】圖

【資料結構與演算法】圖


    一、概念

    定義: 圖由集合和集合組成,記做G=(V,E),其中點集合不能為空且應該有窮,邊集合可以為空。

    ①有向圖:邊有方向,用<Vi,Vj>表示

    ②無向圖:邊沒有方向,用(Vi,Vj)表示

    ③完全圖:每兩個頂點之間都有連線,有向完全圖的邊有n(n+1)個;無向完全圖有n(n+1)/2個邊。

    ④路徑和迴路:路徑是指從一個點到另外一個點走過的路徑和長度;迴路是指從一個點出發再回到一個點的路徑;簡單迴路是指中間沒有重複經過的點。

    頂點的度、入度、出度:頂點的度(degree)是和邊(V1)相關聯的邊的數目,有向圖中,以V1為頭的弧的數目稱為V1的入度,以V1為尾的弧的數目稱為V1的出度。其中v1——>v2中,v1是弧尾,v2是弧頭。無向圖沒有入度、出度的概念,和邊相連的邊的數目就是度。


    連通圖、連通分量、強連通圖、強連通分量:無向圖G中,如果從頂點V到頂點V’有路徑,則稱V和V’是連通的。如果對於圖G中任意兩個頂點Vi,Vj ∈V都是連通的,則稱為G是連通圖(connected graph).連通分量指的是無向圖中極大連通子圖。在有向圖G中,如果對於每一對Vi,Vj∈V,Vi<>Vj,從Vi到Vj和從Vj到Vi都存在路徑,則稱G是強連通圖。有向圖中極大強連通子圖稱作為有向圖G的強連通分量。

    子圖:假設有兩個圖G={V,{E}}和G’={V’,{E’}},如果V’包含於V,E’包含於E,則稱G’是G的子圖。

    權和網:在圖的邊或弧上,有時標有與它們相關的數,這種與圖的邊或弧相關的數稱作權(Weight)。這些權可以表示從一個頂點到另一個頂點的距離或代價。這種帶權的圖常稱作網(network)。

    ⑨生成樹:一個連通圖的生成樹,它含有圖中全部頂點,但只有足以構成一棵樹的n-1條邊。

    二、儲存結構

    ①鄰接矩陣:反映的是頂點間的相鄰關係。一個n行n列的矩陣表示由n個頂點的圖,如果(i,j)或者<i,j>屬於邊集合,則矩陣中第i行j列的值為1,否則為0。其中,無向圖的鄰接矩陣是對稱矩陣

例如:


    ②鄰接表:為圖的每個頂點建立一個連結串列,第i個連結串列中的結點表示與頂點i相關的邊。

例如:


    ③十字連結串列:(orthogonallist)是有向圖的一種鏈式儲存結構,可以看成是將有向圖的鄰接表和逆鄰接表結合起來得到的一種連結串列。在十字連結串列中對應於有向圖中的每一條弧和每個頂點的結構如下:



例如:


    ④鄰接多重表:針對無向圖; 如果我們只是單純對節點進行操作,則鄰接表是一個很好的選擇,但是如果我們要在鄰接表中刪除一條邊,則需要刪除四個頂點(因為無向圖);在鄰接多重表中,只需要刪除一個節點,即可完成邊的刪除,因此比較方便;因此鄰接多重表適用於對邊進行刪除的操作;頂點節點和鄰接表沒區別:

其結點結構如下:mark | ivex |ilink | jvex | jlink  
其中,mark為標誌域,用以標記該條邊是否已被訪問;ivex和jvex為該邊依附的兩個頂點;ilink和jlink分別為指向依附於ivex和jvex下一條邊的指標。
每個頂點也可以用一個結點表示:data |firstedage
data域儲存和頂點有關的資訊,firstedage指示第一條依附於該定點的邊。
在鄰接多重表中,所有依附於同一頂點邊都串聯在同一連結串列中,由於每條邊依附於兩個頂點,所以每個邊結點同時連結在兩個連結串列中。


    ⑤邊集陣列:帶權圖的另一種儲存結構是邊集陣列,用邊集陣列表示帶權圖時列出每條邊的起、始頂點及依附於這兩個頂點的邊上的權,邊集陣列一般可用一個二維陣列分別儲存依附於每條邊的兩端點,邊上的權值用一個一維陣列儲存。在邊集陣列表示中,陣列中對應的列下標表示同一弧的頂點及權值。它適用於一些以邊為主的操作。這一儲存結構同樣適用於無向圖


三、圖的遍歷

    常見的圖遍歷方式有兩種:深度優先遍歷和廣度優先遍歷,這兩種遍歷方式對有向圖和無向圖均適用。

    ① 深度優先遍歷(DFS)深度優先遍歷的思想類似於樹的先序遍歷。其遍歷過程可以描述為:從圖中某個頂點v出發,訪問該頂點,然後依次從v的未被訪問的鄰接點出發繼續深度優先遍歷圖中的其餘頂點,直至圖中所有與v有路徑相通的頂點都被訪問完為止。

思想:往深裡遍歷,如果不能深入,則回朔;

深度優先:
    1.首先訪問出發頂點V
    2.依次從V出發搜尋V的每個鄰接點W;
    3.若W未訪問過,則從該點出發繼續深度優先遍歷;它類似於樹的前序遍歷。

    ① 廣度優先遍歷(BFS):對圖的廣度優先遍歷方法描述為:從圖中某個頂點v出發,在訪問該頂點v之後,依次訪問v的所有未被訪問過的鄰接點,然後再訪問每個鄰接點的鄰接點,且訪問順序應保持先被訪問的頂點其鄰接點也優先被訪問,直到圖中的所有頂點都被訪問為止。下面是對一個無向圖進行廣度優先遍歷的過程。

思想:對所有鄰接節點遍歷;

廣度優先:
    1.首先訪問出發頂點V
    2.然後訪問與頂點V鄰接的全部未訪問頂點w、X、Y…
    3.然後再依次訪問W、X、Y…鄰接的未訪問的頂點;

四、最小生成樹

     ①圖的生成樹和森林:對於一個擁有n個頂點的無向連通圖,它的邊數一定多餘n-1條。若從中選擇n-1條邊,使得無向圖仍然連通,則由n個頂點及這 n-1條邊(弧)組成的圖被稱為原無向圖的生成樹。(圖的生成樹不是唯一的,從不同的頂點出發可以生成不同的生成樹,但n個結點的生成樹一定有n-1條邊),如圖,顯示了一個無向連通圖的生成樹,雙線圈表示的頂點為生成樹的根結點。


     ①最小生成樹:在一個圖中,每條邊或弧可以擁有一個與之相關的數值,我們將它稱為權。這些權可以具有一定的含義,比如,表示一個頂點到達另一個頂點的距離、所花費的時間、線路的造價等等。這種帶權的圖通常被稱作網。


    第一棵生成樹的權值總和是:16+11+5+6+18=56;第二棵生成樹的權值是:16+19+33+18+6=92。通常我們將權值總和最小的生成樹稱為最小生成樹。

    最小生成樹
    包含圖所有頂點的樹,成為圖的生成樹,各邊權值之和最小的樹成為最小生成樹。
    普里姆演算法:
    1. 定義出發點為一個集合
    2. 其它點為另外一個集合
    3. 找到頂點和其它點的距離,不可到達為無窮大
    4. 每確定一個點,則把這個點當做出發點集合中的點,從此點開始再次迴圈規則
    克魯斯卡爾演算法:
    1. 先確定各個點之間的距離
    2. 畫出各個點
    3. 距離從小到大排序,依次加入畫的頂點中(但是避免形成迴路,如果形成迴路,則忽略此距離),直到各個點之間可以連通。

    五、拓撲排序

    用有向邊表示各頂點活動開始的先後順序,這些頂點組成的網路成為AOV網路。對一個有向無環圖的頂點排成一個線性序列,使得有向邊起點排在該有向邊終點前的序列稱之為拓撲序列。拓撲排序不一定唯一。
    1. 找到入度為0的點,作為起點
    2. 起點完成後,刪除該起點的出度
    3. 在剩餘的aov網路中重複此過程


拓撲排序為:02143567或01243657或02143657或01243567

    六、關鍵路徑

    AOV(拓撲排序)網路中,如果邊上的權表示完成該活動所需的時間,則稱這樣的AOV為AOE網路。其中關鍵路徑是最長的一條路徑。如下:


    上圖中的關鍵路徑為V1--V2--Vk或V1--V4--Vk。