鏈式前向星教學詳解最短路

2021-09-14 03:41:03 字數 1662 閱讀 9889

鏈式前向星

圖的儲存一般有兩種:鄰接矩陣、鄰接表(鄰接表包括一種東西叫前向星)。

若圖是稀疏圖,邊很少,開二維陣列a很浪費;

若點很多(如10000個點)a[10000][10000]又會爆.只能用前向星做.

前向星的效率不是很高,優化後為鏈式前向星,直接介紹鏈式前向星。

資料結構

struct edg

;

鏈式前向星的思想類似於陣列模擬鍊錶,利用next不斷的尋找相同起點的上乙個點的值;

存圖函式

for

(int i =

1; i <= m; i++

)//存圖

在存圖函式中的精髓是head的鬆弛操作,每次找到具有相同起點的邊時都要對head進行一次鬆弛操作;

對於資料:

5 71 2 1

2 3 2

3 4 3

1 3 4

4 1 5

1 5 6

4 5 7

edgs[1].to = 2 edgs[1].next = -1;

edgs[2].to = 3 edgs[2].next = -1;

edgs[3].to = 4 edgs[3].next = -1;

edgs[4].to = 3 edgs[4].next = 1;

edgs[5].to = 1 edgs[5].next = -1;

edgs[6].to = 5 edgs[6].next = 4;

edgs[7].to = 5 edgs[7].next = 5;

head陣列中儲存的資料分別是6 2 3 7 -1;

那麼為什麼next中會有 -1 呢?原因很簡單我們先來看一下列印函式

for

(int i =

1; i <= m; i++

)//輸出圖;第一層遍歷節點,第二層遍歷一i為起點的邊;

cout << endl;

}

我們注意一下第二層遍歷中的結束條件j != -1;也就是說只有以i為起點的第一條邊的next中才會儲存-1值,也是我們的結束條件;

#include

#include

#include

using namespace std;

const

int maxn =

10005

;struct edg

edgs[maxn]

;//用來儲存邊的集合

int head[maxn]

;//head[i]表示以i為起點的最後一條邊在edgs中的位置;

intmain()

for(

int i =

1; i <= m; i++

)//輸出圖;第一層遍歷節點,第二層遍歷一i為起點的邊;

cout << endl;

}for

(int i =

1; i <= n; i++

) cout << head[i]

<< endl;

}

鏈式前向星教學

鏈式前向星 這是一種存圖結構,也被稱為靜態建表存圖的方式,它是一種在時間和空間上最優的存圖結構。無論是建圖還是遍歷圖效率最高的存圖的方式。資料結構 struct edgenode int to int w int next int head n edgenode edges m edgendoe結構...

最短路 Dijkstra 堆優化 鏈式前向星

題目鏈結 在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n表...

最短路(SPFA 前向星

problem description 輸入t,n分別代表有t條通道,和n個地點。接下來t行u,v,w分別表示u地點於v地點之間通道消費,有重複邊 sample input 5 51 2 20 2 3 30 3 4 20 4 5 20 1 5 100 sample output 運用spfa的幾個要...