演算法導論 最小生成樹擴充套件

2021-08-26 12:58:36 字數 1829 閱讀 6288

一,次最小生成樹

定義:設t是圖g的最小生成樹,如果t1滿足ω(t1)=min,則t1是g的次小生成樹。

解釋:除了最小生成樹外,另外乙個生成樹的權值和最小的生成樹,定義為次最小生成樹。

經典題目:poj1679 the unique mst,對於一張圖,判斷最小生成樹是否惟一。惟一的定義是:不存在第二棵生成樹,它的權值與最小生成樹的權值相等。w(次最小生成樹)!=w(最小生成樹)

演算法的思路:1,先生成一棵最小生成樹,

2,然後列舉生成樹以外的邊,每次新增了一條邊後,會產生乙個環

3,依次去掉環上的除新新增的邊以外的權值最大邊,然後判斷新的生成樹與原生成樹權值是否相同(不可能比原來生成樹的權值要小)

總體思路:簡單地說就是判斷新新增的邊是否與環上原有的邊

中權值最大的邊具有相同的權值。(原因:最小生成樹選取的邊都是權值最小的,剩餘的邊》=最小生成樹最大的邊)

方法一:先求最小生成樹,標記出構成最小生成樹邊,然後列舉這些邊,每次刪一條,然後求一次生成樹,將其值儲存起來。求完之後,把刪除的邊補回去。進行下一次刪邊,列舉過程中儲存最小值,如果最小值跟原來的最小生成樹的值相等的話,則說明,該最小生成不唯一,反之唯一。

方法二:用prim演算法求一棵最小生成樹,利用prim演算法的特性,即對於每一步擴充套件,都保持擴充套件的結果是一棵樹,為了方便下一步列舉邊的判斷,我們用乙個max陣列記錄最小生成樹上任意兩點之間的最大邊權

(這裡存在歧義,正解為:找到i點跟j點之間所有邊中最大的一條邊),這一步在prim演算法中很容易做到,因為max[i][j]=max。接下來的操作就是列舉每一條不在最小生成樹中的邊,對於edge[i][j],判斷它是否等於max[i][j],若相等,則說明最小生成樹不惟一。

ps:需要改進的地方,我在邊與點之間做了一些對映,空間開銷比較大,程式設計複雜度也高,以後想辦法寫得更簡潔一些。(update:對於資料量小的題,用鄰接矩陣存比較方便 )

二,度限制最小生成樹

定義:乙個最小生成樹,有乙個節點p的度數限制為=k

求解:1,將p周圍所有邊刪掉,然後在每乙個連通子圖里,求最小生成樹

2,將所有連通子圖,選任意一條邊連線到p上。此時構成一棵樹,如果此時p的度數正好等於其限制的度數,則該數就是答案。如果大於限制,則無解。如果小於限制則進行步驟3。

3,為了使p的度數=k,設現在的最小生成樹為t。列舉每一條(p,i)!∈t,找到t中p到i經過邊最的權值(不是與p直接相連的)記為maxi。刪掉權值為maxi的那條邊,增加(p,i)且p度數增加1。

4,此時p度數依然小於限制,執行步驟3。

例題:poj 1639 picnic planning(限於目前水平……)

三,最優比率生成樹

定義:對於每一條邊存在兩個權值,分別是花費和長度,要生成乙個樹,使得總的花費比上總的長度最小。

例題:poj 2728 desert king(限於目前水平……)

演算法導論 最小生成樹

華電北風吹 日期 2016 1 16 常用的最小生成樹演算法有prime演算法和kruskal演算法。prime演算法基於節點,kruskal基於邊。1 prime演算法 prime演算法屬於貪心演算法,與廣度優先搜尋類似。保持乙個屬於已發現的最小生成樹節點的集合。每一次從未在樹中的節點中選擇乙個與...

演算法導論 最小生成樹(prim演算法)

一,定義 沒有權值時 乙個有n個節點的聯通圖,生成樹是,極小聯通子圖。包含圖中所有節點,且有保持圖聯通的最少的邊。邊有權值時 無向聯通圖g v,e 權值函式,w e r。找到g的一棵最小生成樹,使得 w t 最小。w t 為最小生成樹所有邊權值和。二,prime演算法 1 初始化 u te 節點集u...

演算法導論小結 10 最小生成樹

by 潘雲登 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 演算法導論 第 2版 第 23章。2.主要介紹了兩種構建最小生成樹的方法 kruskal 演算法和prim 演算法。3.kruskal 演算法和prim 演算法,可以以鄰接表表示的圖為基礎 可參考 圖的表示與搜尋 ...