圖的儲存方式(上)-鄰接矩陣

       主要的存儲方式有兩種:鄰接矩陣和鄰接表,前者屬於圖的順序存儲結構,後者屬於圖的鏈接存儲結構。

       這裏主要說鄰接矩陣法。

       所謂鄰接矩陣存儲,是指用一個一維數組存儲圖中頂點的信息,用一個二維數組存儲圖中邊的信息(各頂點之間的鄰接關係),存儲頂點之間鄰接關係的二維數組稱爲鄰接矩陣。

 

       結點數爲n的圖G=(V,E)的鄰接矩陣A是n*n的。將G的頂點編號爲v1,v2,…,vn。若(vi,vj)∈E,則A[i][j]=1,否則A[i][j]=0:

       對於帶權圖而言,若頂點vivj之間有邊相連,則鄰接矩陣中對應項存放着該邊對應的權值,若頂點ViVj不相連,則用∞來代表這兩個頂點之間不存在邊:

       有向圖、無向圖和網對應的鄰接矩陣示例如下圖所示:

       圖的鄰接矩陣存儲結構定義如下:     

#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.稠密圖適合使用鄰接矩陣的存儲表示:這樣子存儲效率比較高。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章