天氣越來越熱,看書還得靜得下心啊,今天繼續圖這一章,概念和算法衆多,第一遍看以廣度優先的形式爲主,以後若要用到具體的算法再去翻“算法導論”吧。下面是學習內容和筆記。
圖(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是否是關鍵路徑上的關鍵活動。