1、8.1 圖形資料結構,圖論裡面的問題非常多,解決的技巧也非常豐富,有很多問題是在討論最佳化的問題,像 minimum spanning trees、 matching problems、maximum flow minimum cut problems 等。也有很多圖論問題是 NP-complete,像Travelling Salesperson Problem 等。,第 8章 圖(Graphs),簡單圖的資料結構基本上有兩種表示法,一種是 adjacency matrix,另一種是 adjacency list。,我們在此僅簡單介紹簡單圖(simple graph) 、簡單圖的資料結構與一些
2、問題的處理,如路徑的搜尋、connected components 等。,例:一個簡單圖如下所示。,圖論的表示式如下:,G = (V, E),其中 V 是頂點(vertex)的集合,E 是邊(edge)的集合。V = v0, v1, v2, v3, v4, v5, v6, v7, v8,E = (v0, v1), (v0, v2), (v0, v3), (v0, v6), (v1, v6), (v2, v3), (v2, v4), (v2, v5), (v3, v4), (v3, v6), (v3, v7), (v4, v5), (v4, v7), (v4, v8),簡單圖的資料結構:adja
3、cency matrix。,以一個二維陣列來表示一個簡單圖:,如果頂點有 9 個,相對應的陣列為 M 9 9。 Index 是 0, 1, , 8。 M(i, j) = 1 即頂點 vi 和 vj 有一邊相連(或edge(vi,vj)E ), M 否則 M(i, j) = 0。 M(i, j) = M(j, i)。 M(i, i) = 0。,例:簡單圖的 adjacency matrix 如下所示。,簡單圖的輸入檔案格式:,第一個數 n 代表 vertices 的個數,第二個數 m 代表 edges 的個數。接著有 m 對的整數,每一對整數代表一個 edge。,例:,140 1 0 2 0 3
4、 0 61 6 2 3 2 4 2 53 4 3 6 3 74 5 4 7 4 8,將簡單圖的輸入轉成 adjacency matrix,其程式如下:,scanf(”%d %d”, ,簡單圖的資料結構:adjacency list。,以一個一維陣列來表示一個簡單圖:,如果頂點有 9 個,相對應的陣列為 M 9 。 Index 是 0, 1, , 8。 M(k) 是一條鍊結,鍊結每個 node 儲存的是和頂點 vk 相連的頂點,k = 0, 1, , 8。,例:簡單圖的 adjacency list 如下所示。,將簡單圖的輸入轉成 adjacency list,其程式如下:,Node 的架構如下
5、:,typedef struct node int vertex; struct node *next;Node;,Adjacency list 的架構如下:,Node * listMAXSIZE;,scanf(”%d %d”, ,void addList(Node *L, int i, int j) Node *pn, *cur; pn = (Node*)malloc(sizeof(Node); pn-vertex = j; pn-next = NULL; if(Li = NULL) Li = pn; else cur = Li; while(cur-next != NULL) cur = cur-next; cur-next = pn; / do the same thing for Lj to include a / Node with vertex i。,依輸入檔案的資料與 addList 等的執行順序,陣列 list 的結果如下所示:,