本文整理嚴蔚敏/吳偉民版《資料結構題集》第 7 章「圖」的全套習題解析,涵蓋基礎知識題(鄰接矩陣/表、遍歷、生成樹、最短路徑、拓撲排序、關鍵路徑)與演算法設計題(各儲存結構基本操作、DFS/BFS 非遞迴、可傳遞性判定、迴路偵測、最長路徑、運算式圖求值、CPM/Dijkstra/Floyd 實作)。
給定有向圖,求:(1) 各頂點入/出度 (2) 鄰接矩陣 (3) 鄰接表 (4) 逆鄰接表 (5) 強連通分量。
lowcost[] 陣列,每輪選擇最小邊加入。計算事件最早/最晚發生時間 ve/vl、活動最早/最晚開始時間 e/l,e==l 為關鍵活動,構成關鍵路徑。
D[k][i][j] = min(D[k-1][i][j], D[k-1][i][k]+D[k-1][k][j])。// Warshall 演算法:傳遞閉包
for (k=0; k
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); // 回溯
}
}
}
dfn/low 陣列與堆疊,low[u] == dfn[u] 為強連通分量根。// 拓撲排序求 ve[]
// 逆拓撲序求 vl[]
// e(ai) = ve(尾點), l(ai) = vl(頭點) - 耗時
// e==l 輸出關鍵活動
void Dijkstra(Graph G, int src) {
// dist[] 初始化 INF, dist[src]=0
// S[] 標記已確定最短路徑
for (i=0; i

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