專題四主要就是最短路徑問題。一般最短路徑有兩種演算法prim與kruscal演算法,然而這兩種演算法核心技術就是並查集。
並查集。即「不相交集合」。將編號分別為1…n的n個物件劃分 為不相交集合,在每個集合中,選擇其中某個元素代表所在集合。常見兩種操作: 合併兩個集合查詢某元素屬於哪個集合 模板演算法:void made(int n) //並查集的初始化int find(int x)//查詢父結點找到集合中的代表元素 return father[x];}void unions(int x,int y) //兩個元素合併成乙個集合其實是組合}
二. 求最小生成樹的prim演算法:
1, 任取乙個頂點加入生成樹;
2, 在那些乙個端點在生成樹里,另乙個端點不在生成樹里的邊中,取權最小的邊,將它和另乙個端點加進生成樹。
3, 重複上一步驟,直到所有的頂點都進入了生成樹為止。
prim演算法:設g=(v,e)是連通帶權圖,v=構造g的最小生成樹的prim演算法的基本思想是:首先置s=,然後,只要s是v的真子集,就作如下的貪心選擇:選取滿足條件is,jv-s,且c[i][j]最小的邊,將頂點j新增到s中。這個過程一直進行到s=v時為止。在這個過程中選取到的所有邊恰好構成g的一棵最小生樹。
三, 求最小生成樹的kruscal演算法 對所有邊從小到大排序;依次試探將邊和它的端點加入生成樹,如果加入此邊後不產生圈,則將邊和它的端點加入生成樹;否則,將它刪去;直到生成樹中有了n-1條邊,即告終止。演算法的時間複雜度o(eloge) 將邊按權值從小到大排序後逐個判斷,如果當前的邊加入以後不會產生環,那麼就把當前邊作為生成樹的一條邊。最終得到的結果就是最小生成樹。並查集 。
總結,專題四主要的目的就是尋找最小生成樹,求最短路徑。這其中有兩種演算法:prim演算法和kruscal演算法。乙個是選點,乙個是選邊。當題目中邊的數目較為複雜時,選用prim演算法。但是一般性問題時,建議選擇kruscal演算法,理解起來比較簡單。
專題四總結
圖的定義 很簡單,g v,e v e分別表示點和邊的集合。圖的表示 主要有兩種,鄰接矩陣和鄰接表,前者空間複雜度,o v2 後者為o v e 因此,除非非常稠密的圖 邊非常多 一般後者優越於前者。圖的遍歷 寬度遍歷bfs start 1 佇列q empty,陣列bool visited v q.pu...
專題四總結
專題四總結 專題四圖演算法,到目前為止學習了並查集,最小生成樹,最短路。並查集找父節點 int find int x 練習四1003 另一種 int find int a 練習四1022 最小生成樹只會用kruscul 演算法,用這乙個能做不少題了也就懶得學 primer.double kru re...
專題四 總結
在這一專題裡,首先了解了圖資料結構的一些基礎知識以及圖的儲存方式。圖的一些基礎知識包括 圖的概念,圖的一些部件的命名,以及一些基本的數量關係 圖的表示形式一般包括 矩陣,鄰接表 我感到最有趣的就是鄰接表的陣列表示形式了,開銷低且高效,感覺甚是神奇,下面貼出鄰接表的陣列表示形式 struct edge...