學最小生成樹的時候一直有很多疑問:1. 為啥不能有迴路?比如克魯斯卡爾演算法:為啥不能有迴路?為啥從最小的邊開始找?
比如普利姆演算法:隨意選起點不會影響結果麼?起點選的那條最短邊就一定是最小樹上的?
2. 為啥從最小的邊開始找?
因為克魯斯卡爾就是以邊為核心,目的就是從小到**n-1條最短的邊,這樣構成的路徑肯定也是最短的(當然構成迴路的邊不能去選);
1. 隨意選擇起點會影響結果麼?
選擇起點時,我們假設其餘的定點都已經連通了(因為他們遲早要連通的),那我們現在隨意算的起點,再選乙個最短路徑是不就已經是整個圖的最優選擇了呢?
2. 起點選的那條最短邊就一定是最小樹上的?
同上1. 樹(tree)
如果乙個無向連通圖中不存在迴路,則這種圖稱為樹。
2. 生成樹 (spanning tree)
無向連通圖g的乙個子圖如果是一顆包含g的所有頂點的樹,則該子圖稱為g的生成樹。
生成樹是連通圖的極小連通子圖。這裡所謂極小是指:若在樹中任意增加一條邊,則將出現一條迴路;若去掉一條邊,將會使之變成非連通圖。
3. 最小生成樹(minimum spanning tree,mst)
或者稱為最小代價樹minimum-cost spanning tree:對無向連通圖的生成樹,各邊的權值總和稱為生成樹的權,權最小的生成樹稱為最小生成樹。
構成生成樹的準則有三條:
<1> 必須只使用該網路中的邊來構造最小生成樹。
<2> 必須使用且僅使用n-1條邊來連線網路中的n個頂點
<3> 不能使用產生迴路的邊。
構造最小生成樹的演算法主要有:克魯斯卡爾(kruskal)演算法和普利姆(prim)演算法他們都遵循以上準則。
4. 克魯斯卡爾(kruskal)演算法
根據邊的加權值以遞增的方式,一次找出加權值最低的邊來構建最小生成樹,而且規定:每次新增的邊不能造成生成樹有迴路,知道找到n-1個邊為止。
5. 普利姆(prims)演算法
以每次加入乙個的臨界邊來建立最小生成樹,直到找到n-1個邊為止。其規則為:以開始時生成樹的集合(集合u)為起始的定點,然後找出與生成樹集合鄰接的邊(集合v)中,加權值最小的邊來建立生成樹,為了確定新加入的邊不會造成迴路,所以每乙個新加入的邊,只允許有乙個頂點在生成樹集合中,重複執行此步驟,直到找到n-1個邊為止。
關於最小生成樹(一) prim演算法
時間限制 1000ms 長度限制 10kb 提交次數 0 通過次數 0 題型 程式設計題 語言 g gcc vc description 給定結點數為n,邊數為m的帶權無向連通圖g,所有結點編號為1,2,3 n。求圖g的最小生成樹的邊權和。輸入格式 第一行兩個正整數n和m。n,m 2000 之後的m...
演算法 最小生成樹演算法原理詳解
演算法簡單描述 1 輸入 乙個加權連通圖,其中頂點集合為v,邊集合為e 2 初始化 vnew 其中x為集合v中的任一節點 起始點 enew 為空 3 重複下列操作,直到vnew v a.在集合e中選取權值最小的邊,其中u為集合vnew中的元素,而v不在vnew集合當中,並且v v 如果存在有多條滿足...
最小生成樹一Prim演算法
題目一堆廢話,直接看輸入輸出 輸入在一組測試資料中 第1行為1個整數n,表示小hi擁有的城市數量。接下來的n行,為乙個n n的矩陣a,描述任意兩座城市之間建造道路所需要的費用,其中第i行第j個數為aij,表示第i座城市和第j座城市之間建造道路所需要的費用。n 10 3 輸出對於每組測試資料,輸出1個...