關於次小生成樹 詳解及模板 僅kruskal

2021-09-27 21:13:00 字數 1510 閱讀 7654

關於次小生成樹 詳解及模板僅kruskal(因為kru太好寫了了了 後續再補上prim

其實九月份的時候就接觸了最小生成樹和最短路,迷迷糊糊過了乙個月,現在回頭看可以發現這兩種演算法有很多相似的地方/思想(舉個栗子:prim和dijkstra \ 次短路和次小生成樹)

關於次小生成樹,首先求出最小生成樹,然後列舉每條不在最小生成樹上的邊(在原本的節點上新增乙個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的距離,在列舉邊的時候會用到

vector<

int>p[manx]

;//擴充套件路徑,path陣列,縮寫p

struct nodea[mamx]

;bool

cmp(node a,node b)

intfind

(int x)

intmain()

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++

) ll res=inf;

//次小生成樹的集合

for(

int i=

1;i<=k;i++)if

(!a[i]

.vis)

//列舉每條沒加入最小生成樹的集合

res=

min(res,ans+a[i]

.w-d[a[i]

.u][a[i]

.v])

;//ans是最小生成樹的權值,減去最小生成樹中u到v這條邊的權值,加上列舉的這一條邊進行比較

if(res>ans) cout<

else cout<

<

"not unique!"

<

}return0;

}

次小生成樹 詳解及模板 (僅kruskal)

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

次小生成樹模板

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

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

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