Learning Data Structure_5_圖(2)

    天氣越來越熱,看書還得靜得下心啊,今天繼續圖這一章,概念和算法衆多,第一遍看以廣度優先的形式爲主,以後若要用到具體的算法再去翻“算法導論”吧。下面是學習內容和筆記。

    

圖(graph)

    1.圖的存儲結構

      鄰接矩陣:頂點數組 + 邊數組(二元);無向圖的邊數組爲對稱矩陣,有向圖非對稱(行的元素和表頂點的出度和,列對應入度和);網圖的邊數組中元素由布爾型變爲權值。

      鄰接表:頂點表(data+firstedge) + 邊表(adjvex+next);有向圖的邊表分出邊表和入邊表;帶權的網圖,在邊表中增加一個weight的數據域。

          十字鏈表:是對有向圖鄰接表的優化;將鄰接表和逆鄰接表結合,重新定義頂點表(data+firstin+firstout),邊表結點結構(tailvex弧尾下標 + headvex弧頭下標 + headline +taillink);創建算法的時間複雜度和鄰接表相同,但是出度和入度可同時方便的求得——關注頂點。

          鄰接多重表:是對無向圖鄰接表的優化;重新定義邊表結構(ivex + ilink + jvex + jlink);ivex和jvex表一條邊的兩個頂點,ilink表指向依附頂點ivex的下一條邊,jlink表指向依附頂點jvex的下一條邊;同一條表,鄰接表用兩個頂點表示,鄰接多重表用一個頂點表示——關注邊。

      邊集數組:由兩個一維數組組成,頂點數組+邊數組(begin + end + weight)。

   2.圖的遍歷

      深度優先DFS(depth first search)和廣度優先BFS(breadth first search)。

    3.最小生成樹

      一個連通圖(帶權)的生成樹是一個極小的連通子圖,含全部n個頂點,只含恰足以構成一棵樹的n-1條邊,把構成連通網的最小代價生成樹稱爲最小生成樹。

      Prim(普里姆)算法: N=(V,{E})是連通圖,開始時從V中任取一點u併入頂點集U,從V-U中取一點vi,從U中取一點ui,使得(ui,vi)權最小,將vi併入U;重複上述過程,直至U =V.

      Kruskal(克魯斯卡爾)算法:嚴版 P175。

    4.最短路徑

      定義:指源頂點到終頂點之間的經過的邊上的權值之和最少的路徑。

      Dijkstra(迪傑斯特拉)算法:初態:D[j] = MIN{D[i] | vi屬於V};次短路徑的終點是vk,則下一條次短的路徑爲或是(v,vk)或是(v,vj,vk)。

      Floyd(弗洛伊德)算法:三個for循環。

    5.拓撲排序:AOV網;拓撲排序算法:建立鄰接表,頂點表(in + data + firstedge)+邊表——解決工程能否順利進行,並給出頂點的順序。

    6.關鍵路徑:AOE網;解決工程完成需要的最短時間——注意與最短路徑相區別,關鍵路徑求的是網中權值和(時間和)最大的一條路徑,即關鍵路徑;算法原理由etv(通過拓撲排序計算得到)和ltv求得ete和lte,根據ete[k]與lte[k]是否相等來判斷ak是否是關鍵路徑上的關鍵活動。




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