鏈式前向星

2022-07-11 22:45:12 字數 1449 閱讀 3472

本蒟蒻記性不太好(`・ω・´),寫一篇鏈式前向星的部落格防止自己以後再忘。

我們在做圖論題的時候首先必須要做的第一步就是存圖,只有將整個圖搭建起來,我們才能夠在上面進行接下來的各種操作,構建鄰接矩陣來記錄是一種很好的方法(因為他簡單),但是往往會損失掉不必要的空間,導致空間直接炸掉,50000×50000的就已經足以卡住程式了,更別提在演算法競賽中我們一般都是100000起步,這時神犇們就創造了一種結構,用來存放圖,便為鏈式前向星。

看這個名字我們就能夠得知,這是乙個通過鍊錶來進行儲存的方法,那麼我們就是一乙個點作為鍊錶的起點,並將以這個點為起點的邊以鍊錶的方式連線在一起。

首先我們需要乙個head[i]陣列來記錄以i為起點的第一條邊,其次我們需要建立乙個結構體來儲存每條邊的一些資訊。

int edge[n];

struct edgee[n];

這樣我們就可以將每條邊的資訊儲存起來了。

但是我們應該如何將資料輸入進去呢?這時我們就需要用到乙個add函式。

int cnt = 0; //用來記錄是第幾條邊

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

這部分我們做乙個圖可以更好的理解這個add函式。

(請原諒我粗糙的畫工)

通過這個圖我們就可以很清晰的明白在鏈式前向星中每個變數的意思,to既用來指向這條邊終點,w為邊權,next是下一條邊的儲存位置,而head[u]則用來記錄這條邊在整個鍊錶當中所處的位置。

我們建圖都是為了遍歷它來做的前置準備工作,那麼我們需要用乙個for迴圈來對它進行遍歷。

for(int i = head[x]; i; i = edge[i].next)
我們從x這條邊開始遍歷,首先i取的是x這條邊它所處在鍊錶中的第幾個位置,i = edge[i].next指的是i下乙個遍歷的物件是i這條邊所連線的下一條邊,中間的i是用來保證i大於0,這樣的話當遍歷到最後乙個元素的時候next指向的是乙個空指標,那麼這個迴圈將會結束,我們就會很容易的將這個圖遍歷一遍。

那麼接下來便是完整的**了。

#include#define n 100010

using namespace std;

int n, m, x, cnt = 0; // n個點, m條邊,遍歷的點,cnt用來記錄第幾條邊

int head[n];

struct edgee[n];

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

void dfs(int x)

}int main()

void dfs(x);

return 0;

}

完結撒花:.☆(▽bai)/$:°★

前向星和鏈式前向星

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

前向星和鏈式前向星

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

前向星和鏈式前向星

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