1. 程式人生 > 其它 >資料結構筆記:圖(待填坑)

資料結構筆記:圖(待填坑)

  • 各種圖定義
    • 圖(Graph)是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為:G(VE),其中,G表示一個圖,V是圖G中頂點的集合,E是圖G中邊的集合。

    • 頂點(Vertex):圖中的資料元素
    • 若頂點vi到vj之間的邊沒有方向,則稱這條邊為無向邊(Edge),用無序偶對(vi,vj來表示。

    • 如果圖中任意兩個頂點之間的邊都是無向邊,則稱該圖為無向圖(Undirected graphs)

    • 若從頂點v到v的邊有方向,則稱這條邊為有向邊,也稱為弧(Arc)。用有序偶對<vi,vj>來表示,v1稱為弧尾(Tail),v2稱為弧頭(Head)
    • 如果圖中任意兩個頂點之間的邊都是有向邊,則稱該圖為有向圖(Directed graphs)
    • 在無向圖中,如果任意兩個頂點之間都存在邊,則稱該圖為無向完全圖
      含有n個頂點的無向完全圖有nx(n-1)/2條邊。
    • 在有向圖中,如果任意兩個頂點之間都存在方向互為相反的兩條弧,則稱該圖為有向完全圖
      含有n個頂點的有向完全圖有n×(n-1)條邊。
    • 有很少條邊或弧的圖稱為稀疏圖,反之稱為稠密圖。(相對概念)
    • 有些圖的邊或弧具有與它相關的數字,這種與圖的邊或弧相關的數叫做權(Weight)。這些權可以表示從一個頂點到另一個頂點的距離或耗費。
    • 這種帶權的圖通常稱為網(Network)
    • 假設有兩個圖G=(V,{B})和G′= (V′,{E′}),如果V′⊆V且E′⊆E,則稱G為G的子圖(Subgraph)


  • 圖的頂點與邊間關係

    • 對於無向圖G=(V{E}),如果邊(v,v′)∈E,則稱頂點v和v互為鄰接點(Adjacent),即v和v′相鄰接。邊(v,v′)依附(incident)於頂點v和v′,或者說(v,v')與頂點v和v'相關聯。頂點v的度(Degree)是和v相關聯的邊的數目,記為TD (v)

    • 對於有向圖G=(V,{E}),如果弧<v,v′>∈E,則稱頂點v鄰接到頂點v′,頂點v′鄰接自頂點v。弧<v,v′>和頂點 v,v′相關聯。以頂點v為頭的弧的數目稱為v的入度(InDegree),記為ID(v);以v為尾的弧的數目稱為v的出度(OutDegree)
      ,記為OD(v);頂點v的度為TD(v)=ID(v)+OD(v)
    • 無向圖G=(V,{E})中從頂點v到頂點v′的路徑(Path)是一個頂點序列(v=vi,0,vi,1,…,vi,m=v′),其中(vi,j-1,vi,j)∈E,1≤j≤m。
    • 路徑的長度是路徑上的邊或弧的數目。

    • 第一個頂點到最後一個頂點相同的路徑稱為迴路環(Cycle)

    • 序列中頂點不重複出現的路徑稱為簡單路徑

    • 除了第一個頂點和最後一個頂點之外,其餘頂點不重複出現的迴路,稱為簡單迴路簡單環

  • 連通圖相關術語

    • 在無向圖G中,如果從頂點v到頂點v′有路徑,則稱v和v′是連通的。如果對於圖中任意兩個頂點 vi、vj∈E, vi和vj都是連通的,則稱G是連通圖(Connected Graph)

    • 無向圖中的極大連通子圖稱為連通分量
      注意連通分量的概念,它強調:
      0.子圖要是連通的
      1.子圖要是連通的
      2.連通子圖含有極大頂點數
      3.具有極大頂點數的連通子圖包含依附於這些頂點的所有邊

    • 在有向圖G中,如果對於每一對vi、vj∈V、vi≠vj,從vi到vj和從vj到vi都存在路徑,則稱G是強連通圖。有向圖中的極大強連通子圖稱做有向圖的強連通分量
    • 一個連通圖的生成樹是一個極小的連通子圖,它含有圖中全部的n個頂點,但只有足以構成一棵樹的n-1條邊。
    • 如果一個有向圖恰有一個頂點的入度為0,其餘頂點的入度均為1,則是一棵有向樹
    • 一個有向圖的生成森林由若干棵有向樹組成,含有圖中全部頂點,但只有足以構成若干棵不相交的有向樹的弧。如圖1是一棵有向圖。去掉一些弧後,它可以分解為兩棵有向樹,如圖2和圖3,這兩棵就是圖1有向圖的生成森林。


  • 圖的抽象資料型別
    ADT 圖(Graph)
    Data
        頂點的有窮非空集合和邊的集合。
    Operation
        CreateGraph(*G, V, VR): 按照頂點集V和邊弧集VR的定義構造圖G。
        DestroyGraph(*G): 圖G存在則銷燬。
        LocateVex(G, u): 若圖G中存在頂點u,則返回圖中的位置。
        GetVex(G, v): 返回圖G中頂點v的值。
        PutVex(G, v, value): 將圖G中頂點v賦值value。
        FirstAdjVex(G, *v): 返回頂點v的一個鄰接頂點,若頂點在G中無鄰接頂點返回空。
        NextAdjVex(G, V, *w): 返回頂點v相對於頂點w的下一個鄰接頂點,若w是v的最後一個鄰接點則返回“空”。
        InsertVex(*G, v): 在圖G中增添新頂點v。
        DeleteVex(*G, v): 刪除圖G中頂點v及其相關的弧。
        InsertArc(*G, v, w): 在圖G中增添弧<v, w>,若G是無向圖,還需要增添對稱弧<w, v>。
        DFSTraverse(G): 對圖G中進行深度優先遍歷,在遍歷過程中對每個頂點呼叫。
        BFSTraverse(G): 對圖G中進行廣度優先遍歷,在遍歷過程中對每個頂點呼叫。
    endADT
  • 圖的儲存結構
    • 鄰接矩陣(Adjacency Matrix)
      用兩個陣列來表示圖。一個一維陣列儲存圖中頂點資訊,一個二維陣列(稱為鄰接矩陣)儲存圖中的邊或弧的資訊。

      設圖G有n個頂點,則鄰接矩陣是一個n×n的方陣,定義為:

      一個無向圖及其對應的鄰接矩陣:

      一個無向圖及其對應的鄰接矩陣:

      設圖G是網圖,有n個頂點,則鄰接矩陣是一個n×n的方陣,定義為:

      一個有向網圖及其對應的鄰接矩陣: