主要的存儲方式有兩種:鄰接矩陣和鄰接表,前者屬於圖的順序存儲結構,後者屬於圖的鏈接存儲結構。
這裏主要說鄰接矩陣法。
所謂鄰接矩陣存儲,是指用一個一維數組存儲圖中頂點的信息,用一個二維數組存儲圖中邊的信息(各頂點之間的鄰接關係),存儲頂點之間鄰接關係的二維數組稱爲鄰接矩陣。
結點數爲n的圖G=(V,E)的鄰接矩陣A是n*n的。將G的頂點編號爲v1,v2,…,vn。若(vi,vj)∈E,則A[i][j]=1,否則A[i][j]=0:
對於帶權圖而言,若頂點vi和vj之間有邊相連,則鄰接矩陣中對應項存放着該邊對應的權值,若頂點Vi和Vj不相連,則用∞來代表這兩個頂點之間不存在邊:
有向圖、無向圖和網對應的鄰接矩陣示例如下圖所示:
圖的鄰接矩陣存儲結構定義如下:
#define MaxVertexNum 100 //頂點數目的最大值
typedef char VertexType; //頂點的數據類型
typedef int EdgeType;
//帶權圖中邊上權值的數據類型
typedef struct
{
VertexType Vex[MaxVertexNum]; //頂點表
EdgeType Edge[MaxVertexNum][MaxVertexNum]; //鄰接矩陣,邊表
int vexnum,arcnum; //圖的當前頂點數和弧數
}MGraph;
注意:
1.在簡單應用中,可直接用二維數組作爲圖的鄰接矩陣(頂點啥的可以忽略)。
2.當鄰接矩陣中的元素僅表示相應的邊是否存在時,EdgeType可定義爲值爲0和1的枚舉類型。
3.無向圖的鄰接矩陣是對稱矩陣,對規模特大的鄰接矩陣可採用壓縮存儲。
4.鄰接矩陣表示法的空間複雜度爲,其中n爲圖的頂點數|V|。
圖的鄰接矩陣存儲表示法具有以下特點:
1.無向圖的鄰接矩陣一定是一個對稱矩陣(並且唯一)。因此,在實際存儲鄰接矩陣時只需存儲上(或下)三角矩陣的元素。
2.對於無向圖,鄰接矩陣的第i行(或第i列)非零元素(或非∞元素)的個數正好是第i個頂點的度。
3.對於有向圖,鄰接矩陣的第i行(或第i列)非零元素(或非∞元素)的個數正好是第i個頂點的出(或入度)。
4.用鄰接矩陣法存儲圖,很容易確定圖中任意兩個頂點之間是否有邊相連。但也有其侷限性:要確定圖中有多少條邊,必須按行、按列對每個元素進行檢測,所花費的時間代價很大。
5.稠密圖適合使用鄰接矩陣的存儲表示:這樣子存儲效率比較高。