1.對於最小生成樹的任何一條邊e,將它去掉後形成兩個集合u和v,則e是u,v兩集合間所有邊中最小的(假設不是,則可以把e去掉換成一條更小的邊,從而形成一棵更小的生成樹,矛盾)
2.在最小生成樹中的第k長邊是所有生成樹中第k長邊的最短邊。設該邊為e,將它去掉後形成兩個集合u和v,若是生成樹,那麼在u和v間一定有邊,所以加上一條邊要比e大,此時將新生成樹的邊排序,在最小生成樹中比e大的邊有k-1條,加上新添的,比e大的一共有k條,所以新生成樹中第k長邊大於e。
3.次小生成樹可由最小生成樹換一條邊得到
證法一 :可以證明下面乙個更強的結論:t是一棵最小生成樹,t0是一棵異於t的樹,通過變換 t0 ---> t1 ---> t2 ---> ...... ---> tn(t)變成最小生成樹。所謂的變換是,每次把ti中的某條邊換成t中的一條邊,而且樹t(i+1)的權值小於t(i)的權值。
具體操作是 : ① 在 t(i)中任取一條不在t中的邊e
② 把e去掉,剩下兩個連通分量u,v,在t中必有唯一的邊e1連線u和v
③ 顯然e1的權比e小,將e換為e1即可得樹t(i+1)
特別的取t0為任一棵次小生成樹,t(n-1)也就是次小生成樹且跟t差一條邊,得證。
證法二:設t,t1為原圖的最小生成樹和次小生成樹,由定義,不存在權值介於t和t1間的樹,設t的邊e(t) =,且邊按權值從小到大排列,t1的邊集e(t1)=,且邊按權值從小到大排列,設k是第乙個使ek不等於fk的下標,顯然有ek
4.次小生成樹演算法
一種容易想到的方法是列舉刪除最小生成樹上的邊,再求最小生成樹(前提是去掉一條邊後剩下的邊還能形成樹),所得的最小值即為次小生成樹的權值。但複雜度高,相當於執行了n次最小生成樹演算法。
但有一種更簡單的方法:先求最小生成樹t,列舉新增不在t中的邊,則新增後一定會形成環。找到環上邊值第二大的邊(即環中屬於t中的最大邊),把它刪掉,計算當前生成樹的權值,取所有列舉修改的生成樹的最小值,即為次小生成樹。
這種方法在實現時有更簡單的方法:首先求最小生成樹t,並用乙個二維陣列max[u][v]記錄結點u到結點v的路勁上邊的最大值(即最大邊的值)。然後列舉不在t中的邊(u,v),計算t- max[u][v] + w(u,v)的最小值,即為次小生成樹的權值。對於max陣列可以在prim的加邊過程中不斷更新,演算法的具體實現見
關於生成樹 次小生成樹
1.對於最小生成樹的任何一條邊e,將它去掉後形成兩個集合u和v,則e是u,v兩集合間所有邊中最小的 假設不是,則可以把e去掉換成一條更小的邊,從而形成一棵更小的生成樹,矛盾 2.在最小生成樹中的第k長邊是所有生成樹中第k長邊的最短邊。設該邊為e,將它去掉後形成兩個集合u和v,若是生成樹,那麼在u和v...
最小生成樹 次小生成樹
一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...
最小生成樹 次小生成樹 模板
次小生成樹我的理解 在最小生成樹的基礎上,列舉不再最小生陳樹上的邊,然後成環,取出一條除了新加入的那條邊外的最長邊,最終的權值即為次小生成樹的權值。小結論 當次小生成樹的權值與最小生成樹的權值相同時,最小生成樹不唯一。include include include includeusing name...