首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

資料結構教科書習題解析:第 7 章 圖(Graph)完整題解與演算法實作

     編輯:關於C語言

資料結構教科書習題解析:第 7 章 圖(Graph)完整題解與演算法實作

本文整理嚴蔚敏/吳偉民版《資料結構題集》第 7 章「圖」的全套習題解析,涵蓋基礎知識題(鄰接矩陣/表、遍歷、生成樹、最短路徑、拓撲排序、關鍵路徑)與演算法設計題(各儲存結構基本操作、DFS/BFS 非遞迴、可傳遞性判定、迴路偵測、最長路徑、運算式圖求值、CPM/Dijkstra/Floyd 實作)。

一、基礎知識題精選

7.1 有向圖表示法轉換

給定有向圖,求:(1) 各頂點入/出度 (2) 鄰接矩陣 (3) 鄰接表 (4) 逆鄰接表 (5) 強連通分量。

7.7 無向帶權圖最小生成樹

  • Prim 演算法:基於鄰接矩陣,維護 lowcost[] 陣列,每輪選擇最小邊加入。
  • Kruskal 演算法:基於邊集排序,配合 Union-Find 判斷成環。

7.10 AOE 網關鍵路徑 (CPM)

計算事件最早/最晚發生時間 ve/vl、活動最早/最晚開始時間 e/l,e==l 為關鍵活動,構成關鍵路徑。

7.11/7.13 最短路徑

  • Dijkstra:單源最短路徑,貪婪策略,適用非負權。
  • Floyd:全對最短路徑,動態規劃 D[k][i][j] = min(D[k-1][i][j], D[k-1][i][k]+D[k-1][k][j])。

二、演算法設計題核心實作

7.20 圖的可傳遞性判定(鄰接矩陣)

// Warshall 演算法:傳遞閉包
for (k=0; k

7.24 DFS 非遞迴實作(堆疊模擬)

void DFS_NonRec(Graph G, int v) {
    Stack S; InitStack(&S);
    Visit(v); Push(&S, v);
    while (!StackEmpty(S)) {
        int u = GetTop(S);
        int w = FirstAdjVex(G, u);
        while (w != -1 && visited[w]) w = NextAdjVex(G, u, w);
        if (w != -1) {
            Visit(w); Push(&S, w);
        } else {
            Pop(&S, &u);  // 回溯
        }
    }
}

7.31 強連通分量 (Kosaraju/Tarjan)

  • Kosaraju:兩次 DFS,第一次記錄完成時間,第二次在轉置圖按時間遞減搜尋。
  • Tarjan:單次 DFS,維護 dfn/low 陣列與堆疊,low[u] == dfn[u] 為強連通分量根。

7.42 關鍵路徑 CPM 實作(鄰接表)

// 拓撲排序求 ve[]
// 逆拓撲序求 vl[]
// e(ai) = ve(尾點), l(ai) = vl(頭點) - 耗時
// e==l 輸出關鍵活動

7.42 Dijkstra 鄰接表實作

void Dijkstra(Graph G, int src) {
    // dist[] 初始化 INF, dist[src]=0
    // S[] 標記已確定最短路徑
    for (i=0; i

可傳遞性判定 DFS非遞迴 強連通分量 最長路徑 Dijkstra實作1 Dijkstra實作2 Dijkstra實作3

💡 學習建議: 圖論演算法核心在於「狀態空間搜尋」與「最優子結構」。先手繪小圖執行演算法步驟,再對照程式碼,最後在實際專案(如路由、依賴解析、社交網路分析)中應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved