1. 程式人生 > >圖論演算法(一)

圖論演算法(一)

圖的基本概念及表示

圖的基本概念

(graph)可視為一有序二元組G = (V,E), 其中V = {v1,v2,……,vn}為頂點集,V中的元素稱為頂點(vertex),E = {e1,e2,……,en}稱為邊集,E中的元素成為(edge)。E中的每條邊e連線V中的兩個頂點,不妨用e = vi vj 來表示連線頂點vi和vj的邊。

有向圖:點對vi與vj是有序的,即邊是有方向的。
賦權圖:若給圖的每條邊賦以(weight),則G成為賦權圖。
簡單圖:既沒有環,也不存在兩條邊的兩個端點均相同的圖。
完全圖:任何兩個不同頂點之間都有邊相連的簡單圖。
無向圖是連通的:無向圖中從每一個頂點到其他頂點都存在一條路徑。

設v0v1v2^^^vn是一個頂點序列,其中v(i-1)vi表示一條邊,則該頂點序列構成G中的一條途徑(walk).
長度:途徑的長度一般為邊的條數,對於賦權圖,長度為通過的邊的權值之和。
:經過的邊都不相同的途徑稱為跡。
:經過的頂點都不相同的途徑稱為路。
:除了起點和終點相同外,其他頂點均不相同的途徑稱為圈。

設G = (V,E)和G‘ = (V’,E’)是兩個圖,若V’⊆V且E’⊆E,則稱G‘為G的子圖
滿足V’ = V的子圖成為生成子圖
G(V’):若V‘⊆V ,以V’為頂點集,以G中的兩端點均在V‘中的邊組成的集合為邊集的子圖稱為G的由V’匯出的子圖,記為G(V’).
G\V’

:表示以V\V’為頂點集,以E中刪去所有至少有一個頂點在V’中的邊後所得集合為邊集的子圖。
G(E’):設E‘⊆E ,以E’為邊集集,以所有E‘中的邊的端點組成的集合為頂點集的子圖稱為的由E’匯出的子圖,記為G(E’).
|E|:表示邊的條數。

圖的表示

我們考慮有向圖,無向圖可以類似表示。
①使用鄰接矩陣(一個二維陣列)
對於每條邊e = vi vj,我們令A[vi][vj] = 1,否則陣列元素為0(0表示頂點vi 與 vj 之間沒有邊相連). 若為有權圖,可以讓A[vi][vj]等於該權值,用很大或很小的權作為標記表示不存子的邊。
注意:該表示方法優點是非常簡單,但空間需求大,如果圖的邊很少,就會浪費大量的空間。因此最好用於稠密圖的情況。
②使用鄰接表

(連結串列)
對於每一個頂點,我們使用一個表存放所有鄰接的頂點。
這裡寫圖片描述
實際應用中頂點都有名字而不是數字,我們不能通過未知的名字為陣列做索引,可以用散列表,來實現從名字到數字的一個對映。這樣所有的圖論演算法都將使用內部編號。