鏈式前向星
圖的儲存一般有兩種:鄰接矩陣、鄰接表(鄰接表包括一種東西叫前向星)。
若圖是稀疏圖,邊很少,開二維陣列a很浪費;
若點很多(如10000個點)a[10000][10000]又會爆.只能用前向星做.
前向星的效率不是很高,優化後為鏈式前向星,直接介紹鏈式前向星。
資料結構
鏈式前向星的思想類似於陣列模擬鍊錶,利用next不斷的尋找相同起點的上乙個點的值;struct edg
;
存圖函式
在存圖函式中的精髓是head的鬆弛操作,每次找到具有相同起點的邊時都要對head進行一次鬆弛操作;for
(int i =
1; i <= m; i++
)//存圖
對於資料:
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 呢?原因很簡單我們先來看一下列印函式
我們注意一下第二層遍歷中的結束條件j != -1;也就是說只有以i為起點的第一條邊的next中才會儲存-1值,也是我們的結束條件;for
(int i =
1; i <= m; i++
)//輸出圖;第一層遍歷節點,第二層遍歷一i為起點的邊;
cout << endl;
}
#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的幾個要...