圖之表示和遍歷

學習筆記!!!!!

一、什麼是圖(Graphy)?

表示“多對多”的關係,包含一組頂點(V表示頂點集合)和一組邊(E表示邊的集合)。

邊是頂點對:(v,w)屬於E,其中v,w屬於V

有向邊<v,w>表示從v指向w的邊,不考慮重邊和自迴路。


圖的數據對象集:G(V,E)由一個非空的有限頂點集合v和一個有限邊集合E組成。注意,圖可以沒有邊,但至少會有一個頂點。(可以N個頂點,但沒有一條邊,這也是圖)(樹可以沒有任何節點--空樹)


二、使用鄰接矩陣表示圖

鄰接矩陣G[N][N]--N個頂點從0到N-1編號,G[i][j]=1,如果<vi,vj>是G的邊,否則爲0。但對於無向圖鄰接矩陣的存儲會浪費一半的空間,可以使用一個瘡毒爲N(N+1)/2的一位數據來存儲。

對於網絡,G[i][j]值爲兩點之間邊的權重。

度:從某點發出的邊數--出度,指向該點的邊數--入度。

無向圖:對應行或列非0元素個數;

有向圖:對應行非0元素個數爲出度,對應列非0元素個數爲入度。

無向完全圖:對於n個頂點的無向圖,若有2(n-1)/2條邊,則爲無向完全圖。

三、使用鄰接表表示圖

鄰接表:G[N]爲指針數組,對應矩陣每行一個鏈表,只存非0元素。某頂點指針依次指向所有其相連的節點。

需要空間:需要N個頭指針+2E個結點(每個結點至少2個域)
注意:鄰接表若邊數E<N(N-1)/4時是節省空間的,但大於時,節省效果反而不好。也就是說鄰接表適合夠稀疏的圖。
鄰接表方便計算無向圖頂點的度和有向圖頂點的出度,二入度的計算需要構造“逆鄰接表”。
鄰接表不易檢查任意一對頂點間是否存在邊。
用鄰接表表示有個頂點、條邊的圖,則遍歷圖中所有邊的時間複雜度爲——O(N+E)

四、圖的遍歷

深度優先搜索(DFS):類似樹的先序遍歷
DFS 在訪問圖中某一起始頂點 v 後,由 v 出發,訪問它的任一鄰接頂點 w1;再從 w1 出發,訪問與 w1鄰 接但還沒有訪問過的頂點 w2;然後再從 w2 出發,進行類似的訪問,… 如此進行下去,直至到達所有的鄰接頂點都被訪問過的頂點 u 爲止。接着,退回一步,退到前一次剛訪問過的頂點,看是否還有其它沒有被訪問的鄰接頂點。如果有,則訪問此頂點,之後再從此頂點出發,進行與前述類似的訪問;如果沒有,就再退回一步進行搜索。重複上述過程,直到連通圖中所有頂點都被訪問過爲止。    

DFS時間複雜度:
用鄰接圖:O(N+E);用鄰接矩陣:O(N*N)

廣度優先搜索(BFS):類似於樹的層序遍歷,程序中藉助隊列。
從圖中的某個頂點V出發,訪問之,並將其訪問標誌置爲已被訪問,即visited[i]=1;依次訪問頂點V的各個未被訪問過的鄰接 點,將V的全部鄰接點都訪問到;分別從這些鄰接點出發,依次訪問它們的未被訪問過的鄰接點,並使“先被訪問的頂 點的鄰接點”先於“後被訪問的頂點的鄰接點”被訪問,直到圖中所有已被訪問過的頂 點的鄰接點都被訪問到。依此類推,直到圖中所有頂點都被訪問完爲止 。

BFS時間複雜度:
用鄰接圖:O(N+E);用鄰接矩陣:O(N*N)

BFS:對於解決最短或最少問題特別有效,而且尋找深度小,但缺點是內存耗費量大(需要開大量的數組單元用來存儲狀態)。

DFS:對於解決遍歷和求所有問題有效,對於問題搜索深度小的時候處理速度迅速,然而在深度很大的情況下效率不高


連通:如果從V到W存在一條(無向)路徑,則稱V和W是連通的
路徑:V到W的路徑是一系列頂點{V, v1, v2, …,vn , W}的集合,其中任一對相鄰的頂點間都有圖中的邊。
路徑的長度是路徑中的邊數(如果帶權,則是所有邊的權重和)。
如果V到W之間的所有頂點都不同,則稱簡單路徑.
 迴路:起點等於終點的路徑
連通圖:圖中任意兩頂點均連通(圖中任意兩個節點,都能找到路徑,一個節點的圖也是連通圖,其連通分量有1個)

連通分量:無向圖極大連通子圖(該子圖是連通的,並且再加一個節點後,該子圖就不連通了)
該連通分量的極大頂點數:再加1個頂點就不連通了
該連通分量的極大邊數:包含子圖中所有頂點相連的所有邊

強連通:有向圖中頂點V和W之間存在雙向路徑,則稱V和W是強連通的(v到w有路徑,同事w到v也能找到路徑)
強連通圖:有向圖中任意兩頂點均強連通
強連通分量:有向圖的極大強連通子圖


具有N(>0)個頂點的無向圖至少有1個連通分量。(一個節點的圖有1個連通分量)
具有N(>0)個頂點的無向圖最多有N個連通分量。(該圖只有N個頂點,任意頂點間無邊)
樹是最小的連通圖,少一條邊便不連通

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