次小生成樹(最小生成樹演算法 倍增LCA)

2021-10-08 13:25:18 字數 2385 閱讀 4555

次小生成樹:顯然就是除開最小生成樹外最小的乙個生成樹。

非嚴格次小生成樹:權值和>=最小生成樹。

嚴格次小生成樹:權值和>最小生成樹

求解:每次在非最小生成樹的邊裡找一條,將這條邊加入樹,此時一定形成環,再刪去環中除該邊外最大的一條邊。依次列舉每條邊,找到加入邊-刪除邊最小的一種情況,即可求出非嚴格次小生成樹。

當加入邊的權值=刪去邊的權值時,就不是嚴格的了,所以可以再記錄環中第二大的邊,當非嚴格時,刪去第二大的邊,即可變為嚴格的。

尋找環中的最大/次大邊:先求出邊的兩端點的lca(最近公共祖先),再分別求端點1到lca的最值和端點2到lca的最值,最後取最大值即可。找第二大值時也用倍增的思想先記錄,稍微難一些。

用kruskal的時間複雜度:

o(nlogn+mlogm),倍增是nlogn ,kruskal堆優化是mlogm。

例題:嚴格次小生成樹

#

include

#define

maxn

100005

#define

maxm

300005

#define

maxpow15#

define

inf100000000000

#define

lllong

long

using

namespace std;

struct

edge

;edge edge[maxm]

;structto;

struct

node

;node node[maxn]

;long

long f[maxn]

;long

long

find

(long

long x)

long

long f2[maxn]

[maxpow+5]

;long

long max1[maxn]

[maxpow+5]

,max2[maxn]

[maxpow+5]

;//非嚴格就把max2相關的刪掉

long

long n,m,x,y,z,ans=

0,ans2=inf;

priority_queueq1;

bool

operator

<

(const edge&a,

const edge& b)

long

long

lca(

long

long a,

long

long b)

return f2[b][0

]==0?b:f2[b][0

];}long

long

change

(long

long x,

long

long lca,

long

long v)

x=f2[x]

[i];}}

if(v!=maxx1) ans2=

min(ans2,v-maxx1)

;else ans2=

min(ans2,v-maxx2)

;//非嚴格:

//ans2=min(ans2,v-maxx1); 前面的if也給刪掉

return0;

}ll dfs

(ll x)

}dfs

(i);

}return0;

}int

main()

);edge[i]=;

}for

(long

long i=

1;i<=n;i++

)//找最小生成樹

long

long totedge=0;

while

(!q1.

empty()

)); node[now.b]

.to.

push_back()

;}if(totedge>=n-1)

break;}

//處理lca倍增,最大值,第二大值

dfs(1)

;//處理嚴格次小生成樹

for(

long

long i=

1;i<=m;i++

) cout

}

參考:

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...

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

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

最小生成樹與次小生成樹

題意 給出兩個不同方案,每個方案使得所有的城堡被連通 形成連通圖 同時使邊權之和盡量小,問第乙個方案與第二個方案的大小關係。解題思路 因為m個橋能使n個城堡聯通,而兩個大爺的方案中至少存在乙個橋不相同,那麼我們判斷這是乙個求次小生成樹的方法。求次小生成樹模板 列舉 刪邊 再求mst複雜度有點高,看題...