既然接觸了最短路徑演算法,也就肯定會接觸最小生成樹中的prim演算法。
prime演算法主要是來從乙個無向圖(注意,是無向圖)來生成乙個權值和最小的最小生成樹(一定無環),最小生成樹當然權值和唯一但是生成樹的結構不唯一。prim演算法的主體構造和迪傑斯特拉演算法極其相似,並且採用的都是貪心思想,也就是在選取當前最小的權值邊,加入該邊對應的節點,從而進行構造;
其主要的思路和流程如下所示:
對於主體來說,我們維護乙個集合,集合裡包含點,點就是已經確定作為生成樹節點。每次操作將不在集合內的點加入集合中,從而最後使得構成乙個樹。
在進行點選取加入集合之前,先將集合內的所有點的到達未納入集合點的邊進行權值比較,找出權值最小的那個邊,將指向的點納入集合,將邊視為樹中的指向。重複進行,直至乙個樹生成。
理解起來還是很容易的,對於**部分,則要進行抽象,和迪傑斯特拉演算法相同,還是維護乙個distance陣列,該陣列代表的意義是集合到達其他點的距離,可以看成到欲歸納點的邊的權值大小,而不再是迪傑斯特拉中起點到其他點的距離。
所以,**方面還是大同小異:
仍然是構建圖、d陣列,是否訪問過的標誌陣列;
主體方面仍然需要注意一下:
如下所示:
其中ans代表整個圖的權值和,仍然對d[0]賦值,來保證第一步將0節點納入集合。
該迴圈和迪傑斯特拉的目的略有不同,目的是尋找欲歸納點中距集合最小的點,距離近也就說明邊的權值小,從而獲得其節點,要把她歸納到集合中作為樹節點;
下乙個迴圈則是進行distance更新,來為下乙個點歸納做準備。由於新歸納進乙個點進集合,該點到達欲歸納點的權值可能小於先前集合中的其他點,所以進行權值的代替和更新;
總體**如下所示:
const int maxv=1000;
const int inf=1000000000;
int n,g[maxv][maxv];
int d[maxv];
bool vis[maxv];
int prim()
}if(u==-1)
return -1;
vis[u]=true;
ans+=d[u];
for(int v=0;v}}
return ans;
}
關於KMP演算法的個人理解
最近準備接下來的校招面試,一直沒學過資料結構的我,也不得不準備準備這方面的知識。對於字串匹配這個課題,現在有很多的方法,然kmp確實其中經典的一種方法,這兩天找了很多的相關資料,卻發現理解很簡單,而實現卻有點小困難,為了永久解決這個問題,苦心鑽研了下,現把我的理解記錄如下,供有相同疑惑的童鞋一起學習...
關於NSRunloop的個人理解
今天看到了nsrunloop,其實之前也有看了關於nsrunloop的內容,在這裡想簡單的就個人的理解總結一下。其實自己在開發的過程當中,還沒有更多的涉及到nsrunloop的功能。總的來說,nsrunloop就是類似於windows的訊息機制。他的存在是給執行緒增加事件處理機制。對於多執行緒開發而...
個人關於指標的理解
指標是什麼?如何理解指標?因為指標是抽象的,所以這裡我把它擬物化,這樣解釋也許跟容易懂。指標的專業解釋是 指標是記憶體單元的編號。說明 以下的黑方框都代表乙個位元組 1 對於記憶體。我們一般認為記憶體的基本單位是位元組,記憶體空間由很多位元組組成的。記憶體可以儲存資料,所以我們把每個位元組當做是乙個...