定義:圖能夠理解由頂點集合V和邊的集合E構成的一種數據結構
G=(V,E)。圖的邊可用括號括住兩個頂點來表示,一般用圓括號
表示無向圖的邊,尖括號表示有向圖的邊。node
定義:與一個頂點有關的邊的個數稱爲該頂點的度。對有向圖的頂點
的度可進一步分爲出度+入度,出度是指從該頂點出發的邊數,入度是
指到達該頂點的邊數。算法
定義:路徑中包含邊的個數稱爲路徑長度。數組
定義:對於一個圖,從Vi頂點出發有路徑可達頂點Vj,則稱頂點
Vi,Vj連通。對無向圖,若是任何兩個不一樣的頂點都連通,稱爲連通
圖。對於有向圖,若是任何兩個頂點都連通則稱爲強連通圖。網絡
定義:對於一個圖若是對邊賦以權值,則稱這種邊帶權的圖爲網絡。
在實際問題中邊的權可理解爲距離、代價、費用等。數據結構
定義:若一個圖的頂點和邊都是另外一個圖的頂點和邊的子集,也就是
說G2實際是G1的一部分,則稱G2是G1的子圖。指針
圖的存儲結構:一般採用鄰接矩陣表示頂點之間的關聯,這種方法屬
靜態分配內存;另外一種分配存儲的方式是經過鏈式結構表示與頂點關聯
的邊表,這種方式稱爲鄰接表。隊列
定義圖:1鄰接矩陣表示
矩陣的[i,j]元素爲1表示(Vi,Vj)邊存在,爲0表示(Vi,Vj)邊不存在。
CONST n=<MAXgNum>;
TYPE adj=0..1;
adjm=array[1..n,1..n] of adj;{鄰接矩陣}
graph=RECORD
V:array[1..n] of Vtype;{頂點元素}
E:adjm;
END;
鄰接矩陣一樣能夠表示網絡,對於網絡能夠直接在邊的位置上填上權值,沒有邊的位
置能夠認爲權值爲0或一個不可能的很大值MAX,爲了簡化表示可寫爲M。
2用鄰接表表示
用鄰接表表示圖的結構,實際上鄰接表由兩個部分組成,一個是存儲頂點數據元素的
頂點表,另外一個是與頂點相關聯的邊表,對有向圖邊表還要再分爲入邊表和出邊表。
TYPE Epinter=^enode; {指向邊表結點}
enode=RECORD {邊表數據元素}
adjv:1..n; {頂點在頂點表中的位置}
next:epinter; {連接用指針}
END;
Vnode=RECORD {頂點表數據元素}
V:Vtype; {頂點數據}
LINK:Epinter;
END;
adjl=ARRAY[1..N] OF Vnode;
創建無向圖結構的鄰接表算法:
Procedure SCLJB(Var T:adjl);{生成無向圖鄰接表}
Begin
for i:=1 to n do {創建頂點表}
read(T[i],V);
T[i].link:=NIL;
end for;
for k:=1 to e do {E爲邊數}
read(i,j); {讀入邊(Vi,Vj)}
new(s); {分配表邊元素,S爲Epinter類型}
s^.adjv:=j;
s^.next:=T[i].link;
T[i].link:=s; {頂點j做爲Vi的邊表元素}
new(s); {分配鄰接於Vj的邊表元素}
s^.adjv:=i;
s^.next:=T[j].link;
T[j].link:=s; {頂點i做爲Vj的邊表元素}
end for;
End;
對連通圖頂點的遍歷算法:
1連通圖的深度優先遍歷算法
Procedure DFS(i:1..n); {從Vi開始深度優先遍歷}
Begin{設Vflag--標記頂點的數組--和鄰接表T調用時已知}
write(T[i].V); {訪問Vi}
Vflag[i]:=true;
p:=T[i].link; {沿邊表向前一步}
while p<>NIL do {邊表不完繼續深度優先搜索遍歷}
if not Vflag[p^.adjv] {邊表找到的頂點沒有訪問過}
then DFS(p^.adjv);{對找到的頂點繼續深度優先遍歷}
end if;
p:=p^.next; {沿Vi的邊表前進一步}
end while;
End;
2連通圖的廣度優先遍歷算法
Procedure BFS(i:1..n);
Begin
NULL(Q); {隊列Q初始化,用於保存優先搜索邊表中頂點的序號}
Write(T[i].V); {訪問Vi}
Vflag[i]:=true; {置Vi的訪問標記}
ENQU(Q,i); {Vi進隊列}
while not EMPTY(Q) do {隊列不空進BFS}
i:=DEQU(Q); {從隊列取頂點}
p:=T[i].link; {取邊表指針}
while p<>NIL do {沿邊表涉及頂點搜索}
if not Vflag[p^.adjv] {邊表涉及頂點未被訪問過}
then
write(T[p^.adjv].V);
Vflag[p^.adjv]:=true;
ENQU(Q.p^.adjv); {訪問的頂點進隊列}
end if;
p:=p^.next; {在邊表中取下一個鄰接邊}
end while;
end while;
End;內存