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

2022-01-10 10:20:38 字數 1145 閱讀 7735

關於次小生成樹,首先求出最小生成樹,然後列舉每條不在最小生成樹上的邊(在原本的節點上新增乙個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 node a[mamx];

bool cmp(node a, node b)

int find(int x)

int main()

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 << ans << endl;

else cout << "not unique!" << endl;

}return 0;

}

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

關於次小生成樹 詳解及模板僅kruskal 因為kru太好寫了了了 後續再補上prim 其實九月份的時候就接觸了最小生成樹和最短路,迷迷糊糊過了乙個月,現在回頭看可以發現這兩種演算法有很多相似的地方 思想 舉個栗子 prim和dijkstra 次短路和次小生成樹 關於次小生成樹,首先求出最小生成樹,...

次小生成樹模板

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

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

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