前向星這玩意兒是一種邊集陣列,簡單來說其實就是用來儲存樹狀圖(類似於二叉樹)這種資料的。這種陣列用於計算多個數字之間的上下關係,從而可以建立一棵樹。
就像下面這一課二叉樹一樣。
a作為這一棵樹的。。。。起點?被稱為根節點,然後像h,e,f,g這種在末端的被稱為葉節點。之後就是如果兩點可以連線起來,上面的點是父節點下面的是子節點。a是所有節點的父節點。(這裡認為自己也是自己的父節點)。
然後前向星就是拿來儲存這種樹的。例如我們輸入:
1 22 3
3 41 3
4 11 5
4 5並且規定每一行前面的數為後面的數的父節點,這樣的話,我們可以用紙筆畫出一棵數。用前向星的話就是先儲存上面的每乙個點並且進行排序,得到:
編號: 1 2 3 4 5 6 7
起點u: 1 1 1 2 3 4 4
終點v: 2 3 5 3 4 1 5
也就是按照前面的父節點大小為主排序,子節點為次排序。
再建立head陣列用於儲存父節點的位置,len陣列用於儲存該父節點的"長度"得到:
head[1] = 1 len[1] = 3
(意思是第乙個父節點,也就是根節點在第乙個的位置,接下來連續三個陣列都是從屬於第乙個父節點。下述同理)
head[2] = 4 len[2] = 1
head[3] = 5 len[3] = 1
head[4] = 6 len[4] = 2
這樣可以用多個陣列建立一顆模型樹,通過每個節點的位置來判斷從屬關係。這樣處理方式就叫做前向星,這種建模簡單易懂,但是缺點是必須進行排序,即使使用快排也需要時間,在大量的資料下可能會超時,所以就用到了鏈式前向星。
鏈式前向星就是單純的不需要排序,儲存好了的同時也把樹建好了。
首先我們先建立乙個結構體:
struct edgek[100];
這裡k[i].to代表第i條邊的終點,k[i].next代表和i相同父節點的下乙個點,k[i].w則是第i條邊的權值。前面兩個可能難懂,看看下面例子。
哦對了,同時還會有乙個head陣列。
相同的對於上面的那一組資料:
1 22 3
3 41 3
4 11 5
4 5我們儲存一番,得到下面的資料:
k[0].to = 2; k[0].next = -1; head[1] = 0;←第一次輸入
k[1].to = 3; k[1].next = -1; head[2] = 1;
k[2].to = 4; k[2],next = -1; head[3] = 2;
k[3].to = 3; k[3].next = 0; head[1] = 3;←第四次輸入
k[4].to = 1; k[4].next = -1; head[4] = 4;
k[5].to = 5; k[5].next = 3; head[1] = 5;
k[6].to = 5; k[6].next = 4; head[4] = 6;
解釋一下奧,首先k[i]其實就是第幾組資料,這個應該簡單。但是head[i]不一樣,head儲存的地方是中間的地方,即如果是head[a]=b就是第b次的輸入,父節點是a。
to則是代表後面的那乙個點,即在第i次輸入的時候,子節點是to。而next則是來看看有沒有和我父節點一樣的同志,沒有就用-1表示,有就說是第幾次輸入的。這裡拿第一次輸入,和第四次輸入來舉個例子。(大概這裡都能注意到i是從0開始的奧)
第一次的時候很簡單就錄入。
k[0].to = 2; k[0].next = -1; head[1] = 0;
然後第四次輸入的時候,先是k[3].to = 3,這個沒關係,然後其實是先判斷head[1]是不是-1(忘記說了,在這裡next還有head都先初始化成-1奧)。如果是-1的話就和前面一樣,直接儲存就好,如果不是的話就k[i].next=head[1],表示同乙個父節點下還有另外乙個點,之後再head[1]=3進行覆蓋(所以說head[i]永遠儲存以i為父節點的最後乙個子節點,這點很重要,記一下)。這裡其實需要理一下什麼時候i代表第幾次輸入,什麼時候i代表輸入的資料。
前向星和鏈式前向星
我們首先來看一下什麼是前向星.前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置和儲存長度,那麼前向星就構造好了.用len i 來記錄所有以i為起點的邊在陣列中的儲存長度.用head i 記...
前向星和鏈式前向星
前向星 前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置。鏈式前向星 鏈式前向星其實就是靜態建立的鄰接表,時間效率為o m 空間效率也為o m 遍歷效率也為o m next表示當前結點的下...
前向星和鏈式前向星
1 前向星 前向星是以儲存邊的方式來儲存圖,先將邊讀入並儲存在連續的陣列中,然後按照邊的起點進行排序,這樣陣列中起點相等的邊就能夠在陣列中進行連續訪問了。它的優點是實現簡單,容易理解,缺點是需要在所有邊都讀入完畢的情況下對所有邊進行一次排序,帶來了時間開銷,實用性也較差,只適合離線演算法。圖一 2 ...