次小生成樹

2021-06-17 21:06:56 字數 1498 閱讀 8277

分類: 圖論

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 但有一種更簡單的方法 先求最小...