圖結構(Graph)

   定義:圖能夠理解由頂點集合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;內存

相關文章
相關標籤/搜索