原文:http://blog.fishc.com/2535.html
十字鏈表
鄰接表固然優秀,但也有不足,例如對有向圖的處理上,有時候需要再建立一個逆鄰接表~
那我們思考了:有沒有可能把鄰接表和逆鄰接表結合起來呢?
答案是肯定的,這就是我們現在要談的十字鏈表(Orthogonal List)
爲此我們重新定義頂點表結點結構:
接着重新定義邊表結點結構:
十字鏈表的好處就是因爲把鄰接表和逆鄰接表整合在了一起,這樣既容易找到以Vi爲尾的弧,也容易找到以Vi爲頭的弧,因而容易求得頂點的出度和入度。
十字鏈表除了結構複雜一點外,其實創建圖算法的時間複雜度是和鄰接表相同的,因此,在有向圖的應用中,十字鏈表也是非常好的數據結構模型。
鄰接多重表
講了有向圖的優化存儲結構,對於無向圖的鄰接表,有沒有問題呢?
如果我們在無向圖的應用中,關注的重點是頂點的話,那麼鄰接表是不錯的選擇,但如果我們更關注的是邊的操作,比如對已經訪問過的邊做標記,或者刪除某一條邊等操作,鄰接表就顯得不那麼方便了。
到底有多煩?小甲魚用圖片告訴你:
若要刪除(V0,V2)這條邊,就需要對鄰接表結構中邊表的兩個結點進行刪除操作。
因此,我們也仿照十字鏈表的方式,對邊表結構進行改裝,重新定義的邊表結構如下:
其中iVex和jVex是與某條邊依附的兩個頂點在頂點表中的下標。iLink指向依附頂點iVex的下一條邊,jLink指向依附頂點jVex的下一條邊。
也就是說在鄰接多重表裏邊,邊表存放的是一條邊,而不是一個頂點。
不急,馬上進入No pic you say a J8!環節~
邊集數組
邊集數組是由兩個一維數組構成,一個是存儲頂點的信息,另一個是存儲邊的信息,這個邊數組每個數據元素由一條邊的起點下標(begin)、終點下標(end)和權(weight)組成。