鏈式前向星

2022-09-23 21:15:19 字數 2351 閱讀 6050

實際上就是個鍊錶。

#includeusing namespace std;

int n,m;

vectorvis;

vectorhead,next,to,val;

/*head[i]儲存以i為起點的第一條邊的編號

next[i]儲存編號為i的邊的同起點的下一條邊

to[i]儲存編號為i的邊所連向的點的編號

val[i]儲存編號為i的邊的邊權

*/void add(int u,int v,long long w)

//加邊操作

bool find(int u,int v)

return 0;

}//查詢u到v的邊是否存在

void dfs(int x)

}//dfs遍歷該圖

比如要讀這個圖,就要輸入:

6 61 2 3

2 4 5

1 3 3

2 3 3

1 5 5

5 6 4

這就不存反邊了,這是乙個有向圖,來模擬一下add過程:

void add(int u,int v,long long w)

//加邊操作

add(1,2,3):

next 0=head 1=-1; val 0=w=3; head 1=0; to 0=v=2;

add(2,4,5):

next 1=head 2=-1; val 1=w=5; head 2=1; to 1=v=4;

add(1,3,3):

next 2=head 1=0; val 2=w=3; head 1=2; to 2=v=3;

add(2,3,3):

next 3=head 2=1; val 3=w=3; head 2=3; to 3=v=3;

add(1,5,5):

next 4=head 1=2; val 4=w=5; head 1=4; to 4=v=5;

add(5,6,4):

next 5=head 5=-1; val 5=w=4; head 5=5; to 5=v=6;

邊連完後的陣列情況:

next 0=-1; next 1=-1; next 2=0; next 3=1; next 4=2;next 5=-1;

val 0=3; val 1=5; val 2=3; val 3=3; val 4=5; val 5=4;

head 1=4; head 2=3; head 3=-1; head 4=-1; head 5=5;head 6=-1;

to 0=2; to 1=4; to 2=3; to 3=3; to 4=5; to 5=6;

好,這麼手推一遍就可以理解這種儲存方法的原理了

接下來看查詢和遍歷;

查詢:

bool find(int u,int v)

return 0;

}//查詢u到v的邊是否存在

比如我們要查詢是否存在邊(1,2):

find(1,2):

進入了迴圈:

首先i=head 1=4,然後發現v=2!=to 4=5,i就變成了next 4=2

然後v!=to 2=3,i變成next 2=0

這個時候to 0=2=v 返回存在;

遍歷:

void dfs(int x)

}//dfs遍歷該圖

比如我們從1開始:

dfs(1):

x=1進來沒走過遍歷到1

i=head 1=4,to 4=5沒走過遍歷到5

i=head 5=5,to 5=6沒走過遍歷到6

i=head 6=-1,走完了回溯到i=head 5=5

i=next 5=-1,走完了回溯到i=head 1=4

i=next 4=2,to 2=3沒走過遍歷到3

i=head 3=-1,走完了,回溯到i=next 4=2

i=next 4=2,next 2=0,to 0=2沒走過遍歷到2

i=head 2=3,to 3=3走過了不管進i=next 3=1;

i=next 3=1,to 1=4沒走過,遍歷到4,但4裡面執行過了回溯回i=next 3=1

i=next 3=1,next 1=-1,走完了進next 4=2再到next 2=3再next 3=1再next 1=-1(中途都走過了)dfs結束

所以遍歷順序為1 5 6 3 2 4

前向星和鏈式前向星

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

前向星和鏈式前向星

前向星 前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置。鏈式前向星 鏈式前向星其實就是靜態建立的鄰接表,時間效率為o m 空間效率也為o m 遍歷效率也為o m next表示當前結點的下...

前向星和鏈式前向星

1 前向星 前向星是以儲存邊的方式來儲存圖,先將邊讀入並儲存在連續的陣列中,然後按照邊的起點進行排序,這樣陣列中起點相等的邊就能夠在陣列中進行連續訪問了。它的優點是實現簡單,容易理解,缺點是需要在所有邊都讀入完畢的情況下對所有邊進行一次排序,帶來了時間開銷,實用性也較差,只適合離線演算法。圖一 2 ...