鏈式前向星只用到了一維陣列就存下了所有的邊,比一般二維陣列存邊法牛皮多了!!
因為每一條邊會包含很多的資訊,所以我們用結構體使得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 ...