鍊錶與鄰接表

2021-08-15 12:31:52 字數 1891 閱讀 1068

對於稀疏圖來說,m要遠遠小於n21

2

3

4

5

6

4 5

1 4 9

4 3 8

1 2 5

2 4 6

1 3 7

第一行兩個整數n m。n表示頂點個數(頂點編號為1~n),m表示邊的條數。接下來m行表示,每行有3個數x y z,表示頂點x到頂點y的邊的權值為z。下圖就是一種使用鍊錶來實現鄰接表的方法。

上面這種實現方法為圖中的每乙個頂點(左邊部分)都建立了乙個單鏈表(右邊部分)。這樣我們就可以通過遍歷每個頂點的鍊錶,從而得到該頂點所有的邊了。使用鍊錶來實現鄰接表對於痛恨指標的的朋友來說,這簡直就是噩夢。這裡我將為大家介紹另一種使用陣列來實現的鄰接表,這是一種在實際應用中非常容易實現的方法。這種方法為每個頂點i(i從1~n)也都儲存了乙個類似「鍊錶」的東西,裡面儲存的是從頂點i出發的所有的邊,具體如下。

首先我們按照讀入的順序為每一條邊進行編號(1~m)。比如第一條邊「1 4 9」的編號就是1,「1 3 7」這條邊的編號是5。

這裡用u、v和w三個陣列用來記錄每條邊的具體資訊,即u[i]、v[i]和w[i]表示第i條邊是從第u[i]號頂點到v[i]號頂點(u[i]àv[i]),且權值為w[i]。

再用乙個first陣列來儲存每個頂點其中一條邊的編號。以便待會我們來列舉每個頂點所有的邊。比如1號頂點有一條邊是 「1 4 9」(該條邊的編號是1),那麼就將first[1]的值設為1。如果某個頂點i沒有以該頂點為起始點的邊,則將first[i]的值設為-1。現在我們來看看具體如何操作,初始狀態如下。

讀入第1條邊(1 4 9),將這條邊的資訊儲存到u[1]、v[1]和w[1]中。同時為這條邊賦予乙個編號,因為這條邊是最先讀入的,儲存在u、v和w陣列下標為1的單元格中,因此編號就是1。這條邊的起始點是1號頂點,因此將first[1]的值設為1。

另外這條「編號為1的邊」是以1號頂點(即u[1])為起始點的第一條邊,所以要將next[1]的值設為-1。也就是說,如果當前這條「編號為i的邊」,是我們發現的以u[i]為起始點的第一條邊,就將next[i]的值設為-1。

讀入第2條邊(4 3 8),將這條邊的資訊儲存到u[2]、v[2]和w[2]中,這條邊的編號為2。這條邊的起始頂點是4號頂點,因此將first[4]的值設為2。另外這條「編號為2的邊」是我們發現以4號頂點為起始點的第一條邊,所以將next[2]的值設為-1。

讀入第3條邊(1 2 5),將這條邊的資訊儲存到u[3]、v[3]和w[3]中,這條邊的編號為3,起始頂點是1號頂點。我們發現1號頂點已經有一條「編號為1 的邊」了,如果此時將first[1]的值設為3,那「編號為1的邊」豈不是就丟失了?我有辦法,此時只需將next[3]的值設為1即可。現在你知道next陣列是用來做什麼的吧。next[i]儲存的是「編號為i的邊」的「前一條邊」的編號。

讀入第4條邊(2 4 6),將這條邊的資訊儲存到u[4]、v[4]和w[4]中,這條邊的編號為4,起始頂點是2號頂點,因此將first[2]的值設為4。另外這條「編號為4的邊」是我們發現以2號頂點為起始點的第一條邊,所以將next[4]的值設為-1。

讀入第5條邊(1 3 7),將這條邊的資訊儲存到u[5]、v[5]和w[5]中,這條邊的編號為5,起始頂點又是1號頂點。此時需要將first[1]的值設為5,並將next[5]的值改為3。

此時,如果我們想遍歷1號頂點的每一條邊就很簡單了。1號頂點的其中一條邊的編號儲存在first[1]中。其餘的邊則可以通過next陣列尋找到。請看下圖。

此時遍歷邊某個頂點邊的時候的遍歷順序正好與讀入時候的順序相反。因為在為每個頂點插入邊的時候都直接插入「鍊錶」的首部而不是尾部。不過這並不會產生任何問題,這正是這種方法的其妙之處。

鍊錶與鄰接表

鍊錶 陣列是一種支援隨機訪問,但不支援在任意位置插入或刪除元素的資料結構。與之相對應,鍊錶支援在任意位置插入或刪除,但只能按順序依次訪問其中的元素。我們可以用乙個struct 表示鍊錶節點,其中可以儲存任意資料 另外用prev和next兩個指標指向前後相鄰的兩個節點,構成乙個常見的雙向鍊錶結構。為了...

鄰接表排序(鍊錶排序)

採取冒泡的思想,一次選取兩個,再套一層迴圈即可,但是由於在鄰接表中表頭節點和邊表節點的資料型別並不一樣,因此這相當於乙個沒有頭結點的鍊錶的排序。可以優化一下的是 如果走一遍沒有發生交換,說明已經有序了,因此就不用再進行冒泡了。可以直接跳出迴圈,減少迴圈次數。在邊表節點中,我儲存的是string型別的...

0x13 鍊錶與鄰接表

這東西我還是有點會玩的啊。鄰值查詢這東西不就是維護個前驅後繼嘛。include include include include include include using namespace std struct node a 110000 bool cmp node n1,node n2 int ...