1. 程式人生 > >14 圖的基礎知識-幾種常用的存儲結構

14 圖的基礎知識-幾種常用的存儲結構

尾結點 壓縮 了解 link 同時 log 頂點 對稱矩陣 其中

時間有點緊 沒時間接著更了。。考完研回頭再寫吧


一、鄰接矩陣
1、描述:用一維數組存儲圖頂點的信息
用二維數組存儲圖邊的信息
2、特點:
①無向圖的鄰接矩陣:
是唯一的對稱矩陣,可以壓縮存儲(僅存儲上/下三角);
第i行(列)非零元素為第i個頂點的度
②有向圖的鄰接矩陣:
第i行(列)的非零元素為第i個頂點的出度(入度);
③鄰接矩陣的局限性:要確定多少邊必須按行列檢測,花費時間的代價很大。
④用於確定兩點之間是否有邊非常方便
⑤設圖G鄰接矩陣為A,A的n次方元素A^n[i][j]等於由頂點i~j長度為n的路徑的數目
適用:存儲稠密圖
空間復雜度:O(n2);其中n為圖頂點數|V|
3、存儲結構定義

1
#define maxVertexnum 100 2 typedef struct{ 3 int V[maxVertexnum];//頂點表 4 int edge[maxVertexnum][maxVertexnum];//邊表 5 int vexnum,arcnum;//當前頂點數,弧數 6 }Mgraph;


二、鄰接表
1、描述:對於圖G中每個頂點建一個單鏈表(頂點表結點),第i個單鏈表中結點表示依附vi的邊(邊表結點)
2、特點:
①無向圖需要的存儲空間:O(|V|+2|E|)//無向圖中每個邊在表中出現2次
有向圖需要的存儲空間:O(|V|+|E|)
②稀疏圖用這個存儲賊省空間!
③優:查一個點有幾個關系邊很方便
缺:查入度需要遍歷整個表(麻煩),判斷兩個頂邊之間是否存在邊效率低
④表示不唯一

3、存儲結構定義:

 1 #define maxVertexnum 100
 2 /*邊表結點*/
 3 typedef struct ArcNode{
 4 int adjvex; //表示弧指向的頂點位置
 5 struct ArcNode *next;//指向下一條弧的指針
 6 }ArcNode;
 7 /*頂點表結點*/
 8 typedef struct VNode{
 9 VertexType data; //頂點信息
10 ArcNode *first;//指向第一個依附該頂點的弧的指針
11 }VNode,AdjList[maxVertexnum];
12 /*臨接表*/
13 typedef struct{
14 AdjList vertex; //
鄰接表 15 int vexnum,arcnum;//圖的頂點數與弧數 16 }ALGraph



三、十字鏈表【針對有向圖】
描述:一種鏈式存儲的結構。
1、特點:
①每一條邊用一個結點表示
②頂點之間是順序存儲
③很容易求頂點出度與入度
④表示不唯一,但唯一確定一個圖

2、組成:
弧結點:尾域tailvex/頭域headvex/鏈域hlink(指向弧頭相同的下一條弧)/尾域tlink(指向弧尾相同的下一條弧)/數據域(data)

光描述有點抽象 上個圖

3、存儲結構定義

 1 #define maxVertexNum 100
 2 /*邊表結點*/
 3 typedef struct ArcNode{
 4 int tailvex,headvex;//弧的頭尾結點
 5 struct ArcNode *hlink,*tlink;//分別指向弧頭弧尾相同的結點
 6 int data;
 7 }ArcNode;
 8 /*頂點表*/
 9 typedef struct VNode{
10 VertexType data;//頂點信息
11 ArcNode *firstin,*firstout;//指向第一條入弧和出弧
12 }VNode;
13 /*鄰接表*/
14 typedef struct{
15 VNode xlist[maxVertexNum];//鄰接表
16 int vexnum,arcnum;//記錄圖的頂點數與弧數
17 }GLGraph;



四、鄰接多重表【針對無向圖】


描述:為了解決鄰接表判斷兩頂點之間是否存在邊或者需要對邊執行刪除操作效率低的問題而誕生
所有依附於同一頂點的邊串聯在同一鏈表中
1、特點:
①每條邊只有一個結點
②每個邊結點同時連接在兩個鏈表中

二、組成:
邊結點:
mark(標識域,用於標記該邊是否被搜索過。)
ivex/jvex(該邊依附的兩頂點在圖中的位置)
ilink/jlink(指向下一條依附於頂點ivex/jvex的邊)
data/(數據域)

上個圖

三、存儲結構定義

 1 #define maxVertexNum 100
 2 /*邊表結點*/
 3 typedef struct ArcNode{
 4 bool mark; //訪問標記
 5 int ivex,jvex;//分別指向該弧的兩個結點
 6 struct ArcNode *hlink,*tlink;//分別指向弧頭弧尾相同的結點
 7 int data;
 8 }ArcNode;
 9 /*頂點表*/
10 typedef struct VNode{
11 VertexType data;//頂點信息
12 ArcNode *firstedge;//指向第一條依附該頂點的邊
13 }VNode;
14 /*鄰接表*/
15 typedef struct{
16 VNode adjmulist[maxVertexNum];//鄰接表
17 int vexnum,arcnum;//記錄圖的頂點數與弧數
18 }AMLGraph;

14 圖的基礎知識-幾種常用的存儲結構