次小生成樹模板

2021-09-28 18:52:41 字數 936 閱讀 8891

kruskal演算法

關於次小生成樹,首先求出最小生成樹,然後列舉每條不在最小生成樹上的邊(在原本的節點上新增乙個vis屬性進行判斷即可),並把這條邊放到最小生成樹上面,然後就一定會形成環,那麼我們在這條環路中取出一條(除了新加入的那一條邊)最長的路(這裡可以用d[u][v]來維護)。最終得到的權值就是次小生成樹的權值。

#include#include#include#include#define ll long long

#define r register int

#define inf 0x3f3f3f3f

using namespace std;

const int manx=200+5;

const int mamx=1e5+5;

int n,m,u,v,w,k;

int f[manx],d[manx][manx]; //d陣列用來維護u到v的距離,在列舉邊的時候會用到

vectorp[manx]; //擴充套件路徑,path陣列,縮寫p

struct nodea[mamx];

bool cmp(node a,node b)

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

sort(a+1,a+1+k,cmp);

ll ans=0;

int total=1;

for(int i=1;i<=k;i++)

{u=find(a[i].u),v=find(a[i].v);

if(u==v) continue;

ans+=a[i].w;

f[u]=v;

a[i].vis=1; //標記進去最小生成樹的集合

total++;

int l1=p[u].size(),l2=p[v].size();

for(int j=0;j

最小生成樹 次小生成樹 模板

次小生成樹我的理解 在最小生成樹的基礎上,列舉不再最小生陳樹上的邊,然後成環,取出一條除了新加入的那條邊外的最長邊,最終的權值即為次小生成樹的權值。小結論 當次小生成樹的權值與最小生成樹的權值相同時,最小生成樹不唯一。include include include includeusing name...

最小生成樹 次小生成樹

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