鏈式前向星(模板)

2022-06-24 15:24:10 字數 1425 閱讀 5007

一種非常厲害的存圖的資料結構!

本質:模擬鍊錶的操作,鏈式儲存圖。(2,3都可以模擬鍊錶的操作,替代鍊錶)

(1)二維陣列存圖:map[x][y],一維代表出發點,二維代表它所連線的所有點。(不連線設為inf)

(2)鏈式前向星存圖:head[x]相當於一維代表了出發點,之後t[i].next一條鏈相當於二維代表了所有(與它)連線的點。(不連線的到0就停止了)。

如head[x],t[head[x]].to,t[head[x]].w,t[head[x]].next,完美表示了一條邊的兩端點,權值,甚至下一條邊儲存位置序號。

所以說,二維陣列存圖很浪費空間(有的題目要求大也存不下),有的點之間沒有連線就不用存(我們也不用),但二維陣列把沒鏈結的點之間也存下來了並且設為inf。

但鏈式前向星相當於鍊錶,與某個點連線的所有點存下來形成一條鏈,有多少存多少,沒有的就不存,節省了空間。(至於鄰接鍊錶就不說了,不直觀操作不方便)

好,經過了鏈式前向星存圖原理的誘導!明白了關鍵之處是:head[x]一維代表了出發點,之後一條鏈相當於二維代表了所有(與它)連線的點!

既然如此我們完全可以用vector代替鏈式前向星,因為vector更好理解看起來更直觀!(本質:也相當於一條鏈,必須乙個乙個尾插入pushback,這就是鍊錶啊!)

注意:vector容器裡面什麼都可以塞,各種資訊都存放的下,又相當於乙個結構體。所以存圖,對付空間問題,鏈式之類的最好用vector,一般都能解決。(雖然不一定比前向星快,但是操作方便,理解直觀啊!)

更新實測:資料小量或一般的時候沒什麼,但大量或極端時,鏈式前向星比vector快!洛谷p4779,前向星比vector快了200ms左右!

一般情況下先vector好理解,一般夠用了,不行了再換鏈式前向星!

前向星

1

int head[maxn];//

每個頂點(從i出發)的第一條邊(相當於頭指標,指向首元結點)

2structpx3

t[maxm*3];//

注意t存的是所有邊數(邊的連線資訊,終點,權值,下條邊都在這裡),無向圖是2倍89

10void add(int x,int y,int z)//

加邊操作

1117

1819

for(int i=head[x];i;i=t[i].next)//

遍歷(與某個點x連線的所有邊和點)

20

vector改進

1

structpx2

t;7 vectorvec[maxn];

89 vec[x].push_back(t);//

加邊操作

1011

for(int i=0;i//

遍歷(與某個點x連線的所有邊和點)

12

可以看到,用了vector存圖無論是加邊,遍歷都方便直觀了許多!

完。

鏈式前向星模板

整理一下,按邊儲存的結構都可以用此儲存。其中edge i to表示第i條邊的終點,edge i next表示與第i條邊同起點的下一條邊的儲存位置,edge i w為邊權值.另外還有乙個陣列head,它是用來表示以i為起點的第一條邊儲存的位置,實際上你會發現這裡的第一條邊儲存的位置其實 在以i為起點的...

前向星和鏈式前向星(詳解 模板)

前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置和儲存長度,那麼前向星就構造好了。用len i 來記錄所有以i為起點的邊在陣列中的儲存長度。用head i 記錄以i為邊集在陣列中的第乙個儲...

前向星和鏈式前向星

我們首先來看一下什麼是前向星.前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置和儲存長度,那麼前向星就構造好了.用len i 來記錄所有以i為起點的邊在陣列中的儲存長度.用head i 記...