實際上就是個鍊錶。
#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 ...