圖是一種比線性表和樹更復雜的數據結構,
在圖中,結點之間的關系是任意的,任意兩個數據元素之間都可能相關。圖是一種多對多的數據結構。
概述
概念:
圖(Graph):
由頂點的有窮非空集合和頂點之間邊的集合組成。
通常表示為:G(V,E),其中,G表示一個圖,V是圖G中頂點的集合,E是圖G中邊的集合。
注意:線性表和樹中可以沒有元素;而在圖中可以沒有邊,但是不允許沒有頂點,。
網:
帶有權重的圖
環:
第一個頂點和最后一個頂點相同的路徑;
基本術語:
無向邊:
若頂點Vi和Vj之間的邊沒有方向,稱這條邊為無向邊(Edge),用(Vi,Vj)來表示。
有向邊/弧(Arc):
若從頂點Vi到Vj的邊有方向,稱這條邊為有向邊。
用<Vi, Vj>來表示,其中Vi稱為弧尾(Tail),Vj稱為弧頭(Head)。
權(Weight):
表示從圖中一個頂點到另一個頂點的距離。
度:
與頂點相連接的邊數;
出度、入度:
有向圖中的概念,出度表示以此頂點為起點的邊的數目,入度表示以此頂點為終點的邊的數目;
圖的分類:
按邊的類型分類:
-
無向圖(Undirected graphs): 圖中任意兩個頂點的邊都是無向邊。
-
有向圖(Directed graphs): 圖中任意兩個頂點的邊都是有向邊。
按邊的數量分類:
稀疏圖與稠密圖:
有很少條邊或弧的圖稱為稀疏圖,反之稱為稠密圖。
按有無環分類:
- 簡單圖: 不存在自環(頂點到其自身的邊)和重邊(完全相同的邊)的圖
- 簡單環: 除去第一個頂點和最后一個頂點后沒有重復頂點的環;
其他圖的分類:
-
無向完全圖: 無向圖中,任意兩個頂點之間都存在邊。
-
有向完全圖:有向圖中,任意兩個頂點之間都存在方向相反的兩條弧。
-
連通圖:任意兩個頂點都相互連通的圖;
極大連通子圖:
包含竟可能多的頂點(必須是連通的),即找不到另外一個頂點,使得此頂點能夠連接到此極大連通子圖的任意一個頂點;
連通分量:
極大連通子圖的數量;
強連通圖:
此為有向圖的概念,表示任意兩個頂點a,b,使得a能夠連接到b,b也能連接到a 的圖;
儲存結構
常用的有:鄰接表和鄰接矩陣,十字鏈表
遍歷方式
圖的遍歷通常有兩種方法:深度優先遍歷和廣度優先遍歷。
最小生成樹(ST)
最短路徑
概念:
最短路徑:
網中,最短路徑是指兩個頂點之間經過的邊上權值之和最少的路徑。
與最小生成樹不同,路徑上不一定有n個結點,也不一定包含n-1條邊
源點:
路徑上的第一個頂點。
終點:
路徑上的最后一個頂點。
計算最短路徑算法:
迪傑斯特拉(Djikstra)算法:單源最短路
佛洛伊德(Floyd)算法: 所有頂點間的最短路徑
Djikstra算法
注意:我們不考慮負值圈(邊的權值為負數)
迪傑斯特拉算法
作用:
求出單源點最短路徑。
也就是能求出任意兩個頂點之間的最短路徑。(如果有)
思想:
- 初始時,S只包含源點,即S={v},v的距離為0。U包含除v外的其他頂點,即:U={其余頂點},若v與U中頂點u有邊,則<u,v>正常有權值,若u不是v的出邊鄰接點,則<u,v>權值為∞。
- 從U中選取一個距離v最小的頂點k,把k,加入S中(該選定的距離就是v到k的最短路徑長度)。
- 以k為新考慮的中間點,修改U中各頂點的距離;若從源點v到頂點u的距離(經過頂點k)比原來距離(不經過頂點k)短,則修改頂點u的距離值,修改后的距離值的頂點k的距離加上邊上的權。
- 重復步驟b和c直到所有頂點都包含在S中。
Floyd算法
佛洛伊德算法
作用:
所有頂點間的最短路徑;
也就說運行一般算法后,任意兩個頂點的最短路便就直到了。
思想:
我們知道:從任意節點A到任意節點B的最短路徑只有兩種情況:
- 1是直接從A到B
- 2是從A經過若干個節點到B。
所以我們只需要將所有情況的中間路徑遍歷一邊,取
dist[i][j] =min( dist[i][j] ,dist[i][k] + dist[k][j] );
即可。
拓撲排序
概述
拓撲序列
在AOV網中,若不存在回路,(有向無環圖)
則所有活動可排列成一個線性序列,
使得每個活動的所有前驅活動都排在該活動的前面,我們把此序列叫做拓撲序列。
思想:
- 預處理得到每個點的入度
- 執行入度為 0 的點(沒有前驅),放入一個待執行的容器,在圖中刪除,
- 刪除在圖中以他為弧尾的弧刪除。
- 重復上面兩步,直到所有頂點均輸出/途中不存在無前驅的頂點。
- 如果排序后,還剩下部分點,說明圖中有環
- 所有頂點均輸出,則圖中無環。
關鍵路徑
概述:
AOE網(Activity On Edge Network)
把工程計划表示為邊表示活動的網。
用頂點表示事件,弧表示活動,弧的權表示活動的持續時間。
常用來估算工程的時間。
事件:
表示在它之前的活動已經完成,在它之后的活動可以開始。
路徑長度:
路徑上各個活動所持續的事件之和。
關鍵路徑:
從源點到終點具有最大長度的路徑。
關鍵路徑可能不止一條
關鍵活動:
在關鍵路徑上的活動。
Ve(j):是指從始點開始到頂點Vj的最大路徑長度
Vl(j):在不推遲整個工期的前提下,事件vj允許的最晚發生時間
e(i): 若活動ai由弧<vk,vj>表示,則活動ai的最早開始時間應該等於事件vk的最早發生時間。因而,有:e(i)=ve(k);(即:邊(活動)的最早開始時間等於,它的發出頂點的最早發生時間)
思想:
- 先根據首結點的Ve(j)=0由前向后計算各頂點的最早發生時間
- 再根據終結點的Vl(j)等於它的Ve(j)由后向前依次求解各頂點的最晚發生時間
- 根據邊的e(i)等於它的發出頂點的Ve(j)計算各邊的最早開始時間(最早開始,對應最早發生)
- 根據邊的l(i)等於它的到達頂點的Vl(j)減去邊的權值計算各邊的最晚開始時間(最晚開始,對應最晚發生)