鏈式前向星教學

2021-08-21 04:34:24 字數 2247 閱讀 7055

鏈式前向星:這是一種存圖結構,也被稱為靜態建表存圖的方式,它是一種在時間和空間上最優的存圖結構。無論是建圖還是遍歷圖效率最高的存圖的方式。

資料結構:

struct

edgenode{

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】的值來讓同一起點的邊建立鏈式聯絡。

不懂的可以私聊博主。

具體執行**如下:

#include

using

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表示當前結點的下...