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