次小生成樹

2021-06-22 06:08:19 字數 2204 閱讀 3020

分類: 資料結構

c語言 2013-10-15 13:10

324人閱讀收藏 

舉報目錄(?)

[+]

並查集

次小生成樹其實可通過對kruskal演算法進行延伸得到,說簡單點就是多次求最小樹:

假設:第一次求最小生成樹用到了 1、2、4這三條邊,總共5條邊,那迴圈3次的時候,每次分別不用1、2、4求得最小生成樹的mst,最小的mst即為次小生成樹

題目:[html]view plain

copy

print?

題目描述:  

最小生成樹大家都已經很了解,次小生成樹就是圖中構成的樹的權值和第二小的樹,此值也可能等於最小生成樹的權值和,你的任務就是設計乙個演算法計算圖的最小生成樹。  

輸入:  

存在多組資料,第一行乙個正整數t,表示有t組資料。  

每組資料第一行有兩個整數n和m(2<

=n<

=100),之後m行,每行三個正整數s,e,w,表示s到e的雙向路的權值為w。  

輸出:  

輸出次小生成樹的值,如果不存在輸出-1。  

樣例輸入:  

2  3 3  

1 2 1  

2 3 2  

3 1 3  

4 4  

1 2 2  

2 3 2  

3 4 2  

4 1 2  

樣例輸出:  

4  6  

ac**(注釋寫的比較清楚):

[cpp]view plain

copy

print?

#include 

#include 

#include 

#define max 100000

intfather[210];    

// 並查集

intvisit[210]; 

// 記錄最小生成樹用到的邊的下標

intwindex; 

// 記錄最小生成樹用到邊的數量

typedef

struct

node  node;  

/*** 預處理並查集陣列

*/void

preprocess()  

}  /*** kruskal使用貪心演算法,將邊按權值從小到大排序

*/int

cmp(

const

void

*p, 

const

void

*q)  

/*** 並查集尋找起始結點,路徑壓縮優化

*/int

findparent(

intx)  

parent = findparent(father[x]);  

father[x] = parent;  

return

parent;  

}  /**

* 求最小生成樹

*/int

mintree(node *points, 

intm, 

intn)  

if(count == n - 1)   

}  return

flag;  

}  /**

* 求次小生成樹

*/int

secmintree(node *points, 

intm, 

intn)  

if(count == n - 1)   

}  }  

if(flag && tmp < min)   min = tmp;  

}  min = (min == max) ? -1 : min;  

return

min;   

}  int

main(

void

)    

qsort(points, m, sizeof

(points[0]), cmp);  

flag = mintree(points, m, n);  

if(flag == 0)   else

free(points);  

}  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,...

次小生成樹

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