分類: 圖論
2013-02-12 15:03
32人閱讀收藏
舉報次小生成樹:
在求最小生成樹時,用陣列path[i][j]來表示mst中i到j最大邊權。
求完後,直接列舉所有不在mst中的邊,把它加入到mst中構成一棵新的樹,且該樹有環,此環是由剛加入的邊(i,j)造成的,所以可以通過刪除path[i][j]即
可得到新的一顆樹,且所有的該類樹中必有一棵為次小生成樹。
比如如圖所示:
g,h不是mst上的邊,通過加入邊(g,h),得到乙個環(b,h,g),然後由於在計算最小生成樹時已經計算出g,h之間最大邊權為path[g][h] = bh,所以通過刪
除bh即可得到一棵此時最小的生成樹,然後更新答案即可
[cpp]view plain
copy
#include
#include
#include
using
namespace
std;
const
intx = 105;
const
intinf = 100000000;
intmap[x][x],dis[x];
intpath[x][x];
///記錄i,j路徑上的最大邊權
intpre[x];
///前驅頂點
intn;
///頂點數
bool
use[x],in[x][x];
intprim()
return
ans;
} int
main()
intans = prim();
intok =
true
; for
(int
i=1;i<=n&&ok;i++)
//列舉找到不在mst上的邊
for(
intj=1;j<=n&&ok;j++)
if(map[i][j]!=inf&&!in[i][j])
if(ans==ans-path[i][j]+map[i][j])
ok = false
; if
(ok)
printf("%d\n"
,ans);
else
printf("not unique!\n"
);
} return
0;
}
最小生成樹 次小生成樹
一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...
次小生成樹
演算法引入 設g v,e,w 是連通的無向圖,t是圖g的一棵最小生成樹 如果有另一棵樹t1,滿足不存在樹t t t1 則稱t1是圖g的次小生成樹 演算法思想 鄰集的概念 由t進行一次可行交換得到的新的生成樹所組成的集合,稱為樹t的鄰集,記為n t 設t是圖g的最小生成樹,如果t1滿足 t1 min,...
次小生成樹
最小生成樹的演算法想必大家都很了解,主要有kruskal和prim。但如果要求次小生成樹 即第二小的生成樹 呢?一種容易想到的方法是列舉刪除最小生成樹上的邊,再求最小生成樹。用kruskal這種演算法的複雜度為o n elog2e 當圖比較稠密時,複雜度接近o n 3 但有一種更簡單的方法 先求最小...