20201016打卡 鏈式前向星

2021-10-24 20:05:31 字數 1756 閱讀 6178

鏈式前向星只用到了一維陣列就存下了所有的邊,比一般二維陣列存邊法牛皮多了!!

因為每一條邊會包含很多的資訊,所以我們用結構體使得edge陣列能儲存更多的資訊啦!

struct stars;

stars edge[100005];

其中:

to表示這條邊指向的點

next表示下一條起始點相同的邊

w表示邊的權值

要注意理解的是:

(通俗點講就是:先來的排在隊伍的後面,報數的時候從隊伍前面開始報)李姐萬歲!

這時我們會用乙個變數cnt,來紀錄 邊 已經輸入到第幾個了

在輸入邊的時候,先輸入的邊會優先進入edge陣列中,所以並不是起始點相同的是靠在一起輸入的,這時聰明的邊邊們就要問了:

為了幫助邊邊們找到他們的同伴,我們就要引入另外乙個陣列head,它的任務就是儲存對應點的 上一次輸入邊 在edge陣列的位置,在遍歷時還可表示該起始點的第一條邊。

不要忘記對head陣列和cnt初始化,head初始化為-1,表示這個點還沒有邊的加入,cnt從0/1開始都是可以的。

int n,m,cnt=1;

int head[100005];

void start(int all)

當以上事情做完後我們就可以開始加邊了

void add_edge(int u,int v,int w)
其中:

u表示起始點

v表示指向點

w表示邊權值

head[u]=cnt;表示對u點的 上一輸入邊位置的更新

在遍歷圖時我們可以發現,第乙個加入點的邊的next值是-1,這表示它是最後一條邊了,在遍歷此點就可以結束了。

遍歷方法有很多,不管是**師還是冰法師都視題目而定,這裡比較重要的是 同一起始點的邊的遍歷,在寫迴圈時要像下面那樣:從head開始,當為-1時結束,每次找它的next

for(int i=1;i<=n;++i)

}

這裡是用來以此檢驗每個點的邊是否正確,著重理解第二層迴圈

上完整**:

#includeusing namespace std;

struct stars;

stars edge[100005];

int n,m,cnt=1;

int head[100005];

void start(int all)

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

int main()

for(int i=1;i<=n;++i)

} return 0;

}

前向星和鏈式前向星

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

前向星和鏈式前向星

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

前向星和鏈式前向星

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