關於次小生成樹 詳解及模板僅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...