|
有向圖
|
無向圖
|
定義
|
圖中的每條邊都是有方向的。
|
圖中的每條邊都是無方向的。
|
示例圖
|
|
|
說明
|
G=(V1,{E1}),其中:
V1={A, B, C, D, E, F},V1表示由"A,B,C,D,E,F"幾個頂點組成的集合。
E1={<A, B>, <A, C>, <B, C>, <B, E>, <C, D>, <C, F>, <E, F>}。E1是由矢量<A,B>,矢量<A,C>...等組成的集合。其中,<A,C>表示由頂點A指向頂點C的有向邊。
|
G=(V2,{E2}),其中:
V2={A, B, C, D, E, F},V2表示由"A,B,C,D,E,F"幾個頂點組成的集合。
E2={(A, B), (A, C), (B, C), (B, E), (C, D), (C, F), (E, F)}。E2是由邊(A,B),邊(A,C)...等組成的集合。其中,(A,C)表示由頂點A和頂點C鏈接成的邊。
|
|
鄰接矩陣
|
鄰接表
|
定義
|
鄰接矩陣是表示頂點之間相鄰關係的矩陣。設圖G有n個頂點,則鄰接矩陣是一個n*n的方陣,定義爲:
|
當圖中的邊數較少時,用鄰接矩陣來實現圖結構會浪費不少內存空間,使用鄰接表更省空間。
|
示例圖(無向圖)
|
|
|
示例圖(有向圖)
|
|
|
優勢
|
能夠直接判斷兩頂點之間是否有邊或弧,速度很快。
通常用於存儲稠密圖。
|
空間效率高;容易尋找頂點的鄰接點。
通常用於存儲稀疏圖。
|
缺點
|
存儲空間大,會影響算法的空間效率,甚至時間效率。
|
判斷兩頂點之間是否有邊或弧需搜索兩節點對應的單鏈表,沒有鄰接矩陣方便。
|
|
深度優先遍歷(Depth-First-Search, DFS)
|
廣度優先遍歷(Breadth-First-Search, BFS)
|
方法
|
①訪問頂點v;
②依次從v的未被訪問的鄰接點出發,對圖進行深度優先遍歷;直至圖中和v有路徑相通的頂點都被訪問;
③若此時圖中尚有頂點未被訪問,則從一個未被訪問的頂點出發,從新進行深度優先遍歷,直到圖中全部頂點均被訪問過爲止。
|
① 訪問頂點vi;
② 訪問vi的全部未被訪問的鄰接點w1 ,w2 , …wk;
③ 依次從這些鄰接點(在步驟②中訪問的頂點)出發,訪問它們的全部未被訪問的鄰接點; 依此類推,直到圖中全部訪問過的頂點的鄰接點都被訪問。
|
示例圖
|
|
|
步驟
|
DFS在訪問圖中某一塊兒始頂點A後,由A出發,訪問它的任一鄰接頂點B;
從B出發,訪問與B鄰接但尚未訪問過的頂點E;
從E出發,訪問與E鄰接但尚未訪問過的頂點G;
由於G的鄰接頂點都已被訪問,因此退回到頂點E;
由於E的鄰接頂點都已被訪問,因此退回到頂點B;
由於B有未訪問的鄰接頂點C,則從B出發,訪問C;
從C出發,訪問與C鄰接但尚未訪問過的頂點F;
從F出發,訪問與F鄰接但尚未訪問過的頂點D(也能夠先訪問H);
由於D的鄰接頂點都已被訪問,因此退回到頂點F;
由於F有未訪問的鄰接頂點H,則從F出發,訪問H;
從H出發,訪問與H鄰接但尚未訪問過的頂點I;
由於I的鄰接頂點都已被訪問,因此退回到頂點H;
由於H的鄰接頂點都已被訪問,因此退回到頂點F;
由於F的鄰接頂點都已被訪問,因此退回到頂點C;
由於C的鄰接頂點都已被訪問,因此退回到頂點B;
由於B的鄰接頂點都已被訪問,因此退回到頂點A;
全部頂點都被訪問過,遍歷結束。
|
BFS在訪問圖中某一塊兒始頂點A後,由A出發,依次訪問它的鄰接頂點B、C、D;
由於先訪問的B,因此從B出發,訪問與B鄰接但尚未訪問過的頂點E;
從C出發,訪問與C鄰接但尚未訪問過的頂點F;
由於D的鄰接頂點均被訪問,因此從E出發,訪問與E鄰接但尚未訪問過的頂點G;
從E出發,訪問與F鄰接但尚未訪問過的頂點H;
從H出發,訪問與H鄰接但尚未訪問過的頂點I;
全部頂點都被訪問過,遍歷結束。
|
結果
|
A→B→E→G→C→F→D→H→I
|
A→B→C→D→E→F→G→H→I
|
原文:https://www.cnblogs.com/sunshineliulu/p/7833793.htmlhtml