vijos次小生成樹

2022-05-19 11:13:34 字數 1304 閱讀 9164

費用第二小的方案的定義為:與費用最小的方案不完全相同,且費用值除費用最小的方案外最小。

同vijos 1070 **:

題解:次小生成樹,就是求除了最小生成樹之外最小的那個生成樹。

下面介紹一下利用prim求次小生成樹的主要步驟。

1.先求出來最小生成樹。並將最小生成樹任意兩點之間路徑當中的權值最大的那一條找出來,為什麼要找最大的呢,因為生成樹加入一條邊之後一定構成了迴路,那麼肯定要去掉這個迴路當中一條邊才是生成樹,那麼,怎麼去邊才是次小的,那就去掉除了剛剛新增的一條邊之外迴路當中權值最大的乙個,所以留下的就是最小的。

2.列舉最小生成樹外的每一條邊。找出最小的就是次小生成樹。

**如下,若還是不懂,**中有注釋,可自行參悟

1 #include2 #include3

using

namespace

std;

4int s,minn,g[501][501],m,x,y,z,ss,minn2,low[501],pre[501],low2[501][501

]; 5

int i,mini,sum,n,t; bool b[501],used[501][501];6

intmain() 715

for(i=1;i<=m;i++)

16

20for(i=1;i<=n;i++)

21 low[i]=123456789,pre[i]=i;

22 pre[1]=0

; 23 low[1]=0;s=0;ss=923456789;24

intk,kk;

25while(1

)

2635}36

if(minn==123456789)break

;37 b[mini]=1

;38 s=s+minn;

39 used[mini][pre[mini]]=used[pre[mini]][mini]=1;40

for(i=1;i<=n;i++)

4147

}48 printf("

cost: %d\n

",s);

49for(int i=1;i<=n;i++)

5055

if(ss==923456789)ss=-1;//

如果沒有邊可以替換,即沒有最小生成樹,輸出-1

56 printf("

cost: %d

",ss);

57 }

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 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,...

次小生成樹

分類 圖論 2013 02 12 15 03 32人閱讀收藏 舉報次小生成樹 在求最小生成樹時,用陣列path i j 來表示mst中i到j最大邊權。求完後,直接列舉所有不在mst中的邊,把它加入到mst中構成一棵新的樹,且該樹有環,此環是由剛加入的邊 i,j 造成的,所以可以通過刪除path i ...