鏈式前向星:這是一種存圖結構,也被稱為靜態建表存圖的方式,它是一種在時間和空間上最優的存圖結構。無論是建圖還是遍歷圖效率最高的存圖的方式。
資料結構:
structedgenode{
int to;
int w;
int next;
int head[n];
edgenode edges[m];
edgendoe結構體中,有三個變數,第乙個變數to,代表這條邊的終點在哪,第二個變數代表這條邊的權值,第三個變數代表,於這個邊起點相同的下一條邊的編號。
head陣列中,陣列下標代表,第幾個點,第i個位置存的的資料是以第i個點為起點的最後一條邊的編號為多少。
例如:1 3 2 ·····第1條邊
1 2 4······第2條邊
2 3 1······第3條邊
2 4 5······第4條邊
head 陣列中1的位置是中的資料是2,2的位置中資料是4
edges中 to存的的是3,w存的是2,next 中存的是-1
edges中 to存的是2,w存的是4,next是1
edges中to存的是3,w存的是1,next存的是-1
edges中to存的4,w存的是5,next存的是3
注:為什麼next會有-1呢,後面會是說明。
具體的存圖函式如下:
for(int i = 1 ;i <= m ; i++ ){int a,b,c;
cin >> a >> b >> c;
edges[i].to = b;
edges[i].w = c;
edges[i].next = head[a];
head[a] = i;
通過一直更新head【a】的值,來達到鏈式的作用。我們遍歷了乙個點之後就可以通過next來查詢下乙個同起點的下一條邊在edges中第幾個。
具體遍歷函式如下:
for(int i = 1 ; i <= n ; i ++){for(int k = head[i] ; k != -1 ; k = edges[k].next){
cout
<< i << " "
<< edges[k].to << " "
<< edges[k].w << endl;
第一層for迴圈是找每乙個點,依次遍歷點1--n。第二層for迴圈是遍歷以i為起點的所有邊,k首先等於head【i】,上述說過head【i】中存的是以i為起點的最後一條邊的編號。所以從這條邊開始找。找完之後,讓 k = edge【k】.next來找下一條。我們初始化head中為-1,所以找到你最後乙個邊(也是 你第乙個輸入以這個邊為起點的邊)時,你的head【i】.next為-1,則為終止條件。
鏈式前向星的核心是存圖中的head【a】= i;這句話。通過不斷更新head【i】的值來讓同一起點的邊建立鏈式聯絡。
不懂的可以私聊博主。
具體執行**如下:
#includeusing
namespace
std;
const
int m = 100005;
const
int n = 100005;
struct
edgenode{
int to;
int w;
int next;
int head[n];
edgenode edges[m];
intmain() {
int n , m ;
cin >> n>> m;
memset(head,-1,sizeof(head));
for(int i = 1 ;i <= m ; i++ ){
int a,b,c;
cin >> a >> b >> c;
edges[i].to = b;
edges[i].w = c;
edges[i].next = head[a];
head[a] = i;
for(int i = 1 ; i <= n ; i ++){
for(int k = head[i] ; k != -1 ; k = edges[k].next){
cout
<< i << " "
<< edges[k].to << " "
<< edges[k].next << endl;
return
0 ;原文:
鏈式前向星教學詳解最短路
鏈式前向星 圖的儲存一般有兩種 鄰接矩陣 鄰接表 鄰接表包括一種東西叫前向星 若圖是稀疏圖,邊很少,開二維陣列a很浪費 若點很多 如10000個點 a 10000 10000 又會爆.只能用前向星做.前向星的效率不是很高,優化後為鏈式前向星,直接介紹鏈式前向星。資料結構 struct edg 鏈式前...
前向星和鏈式前向星
我們首先來看一下什麼是前向星.前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置和儲存長度,那麼前向星就構造好了.用len i 來記錄所有以i為起點的邊在陣列中的儲存長度.用head i 記...
前向星和鏈式前向星
前向星 前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置。鏈式前向星 鏈式前向星其實就是靜態建立的鄰接表,時間效率為o m 空間效率也為o m 遍歷效率也為o m next表示當前結點的下...