數據結構——圖

圖也是重點,和樹結合考慮,因爲很多應用就是把圖生成一顆樹。圖邏輯關係是結點集合和
邊集合,但怎麼怎麼存圖到計算機中:順序存儲用鄰接矩陣,鏈式存取用鄰接表,這兩種存
儲方式都要會,即不僅僅看到邏輯關係的圖是圖,用鄰接矩陣或鄰接鏈表表示的也是圖。圖
的遍歷:深度優先搜索生成樹用棧,廣度優先搜索生成樹用隊,要會用它們求連通分量。幾
種圖的應用,拓撲排序求是否有環路(有向無環圖),關鍵路徑的求法(會畫表格求法即可),
會用 Prim 算法求最小生成樹,會用 Dijkstra 算法求最短路徑生成樹(即 D[n]向量的計算)。

一、 圖的概念

  1. 定義:數據結構中有線性結構(前驅和後繼的關係)、樹型結構(層次關係),圖是一種結點具有任意關係的結構。
  2. 術語:無向圖,邊,度;有向圖、弧、出度入度,頭和尾
    稀疏圖;
    子圖;
    賦權圖即網;
    無向圖可能是連通圖,有向圖可能是強連通圖;無向圖中的連通分量,有向圖中的強連通分量;
    聯通圖的生成樹:n個結點、n-1條邊;

二、 圖的存儲結構

  1. 數組表示法——鄰接矩陣表示法
    圖沒有順序映像的存儲結構,但可以藉助數組的數據類型表示元素之間的關係
    typedef enum{DG,DN,UDG,UDN}GraphKind; //枚舉圖的 4 種類型

typedef struct {
VRType adj; //對於無權圖,用 1 或 0 表示是否相鄰;對於帶權圖,直接爲權值,若無權值用無窮。
InfoType * info; //弧或邊額外含有的信息指針
}ArcCell,AdjMatrix[MAX_VERtEX_NUM][MAX_VERtEX_NUM]; //數據元素(結點)之間的關係

typedef struct {
VertexType vexs[MAX_VERtEX_NUM]; //存儲圖中頂點數據
AdjMatrix arcs; //二維數組,記錄頂點之間的關係
int vexnum,arcnum; //記錄圖的頂點數和弧(邊)數
GraphKind kind; //記錄圖的種類
}MGraph;

  1. 鏈式存儲結構——鄰接表
    ①n個頂點對應n個單鏈表,n個單鏈表的表頭又以順序結構存儲、相連接。
    ②單鏈表有一個表頭結點和許多表結點。注意:有向圖的表結點是以結點爲尾的弧的頭,尾就是“出去的頭”
    在這裏插入圖片描述
    在這裏插入圖片描述
    存儲結構描述分三部分:表結點+表頭結點(順序表)+圖(鄰接表整體)
    typedef struct ArcNode{ //表結點結構類型
    int adjvex; //該弧(邊)的終點位置
    struct ArcNode *nextarc; //指向下一條弧的指針
    InfoType info; //該弧的相關信息
    } ArcNode;
    typedef struct Vnode { //表頭結點的類型
    Vertex data; //頂點信息
    ArcNode *firstarc; //指向第一條弧
    } VNode, AdjList[MAX_VERTEX_NUM];
    typedef struct { //鄰接表
    AdjList vertices;
    int vexnum, arcnum; //圖中頂點數n和邊數e
    int kind; //圖的類型
    } ALGraph;

三、圖的遍歷(聯通不連通都可)

  1. 深度優先搜索遍歷DFS(先序、遞歸) 棧!
    ①從圖中某個初始頂點v出發,首先訪問初始頂點v,
    ②然後選擇一個與頂點v相鄰且沒被訪問過的頂點w爲初始頂點,再從w出發進行深度優先搜索,直到圖中與當前頂點v鄰接的所有頂點都被訪問過爲止。
  2. 廣度優先搜索遍歷BFS(層次) 隊列!
    從圖中某頂點vi出發:
    ① 訪問頂點vi ;
    ② 訪問vi 的所有未被訪問的鄰接點w1 ,w2 , …wk ;
    ③ 依次從這些鄰接點(在步驟②中訪問的頂點並按w1,W2…的順序)出發,訪問它們的所有未被訪問的鄰接點; 依此類推,直到圖中所有訪問過的頂點的鄰接點都被訪問;

四、圖的連通性(只考慮無向圖)

  1. 定義:遍歷圖後可以得到生成樹或生成森林
    ①生成樹:只有連通圖有生成樹。
    深度優先生成樹!=廣度優先生成樹
    ②生成森林:非連通圖的各個連通分量的生成樹組成生成森林
    深度優先生成森林!=廣度優先生成森林
    ③最小生成樹:網的生成樹的代價(各邊權之和)最小的那個生成樹
  2. 求最小生成樹——prim算法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章