次小生成樹

2021-08-15 01:36:33 字數 1091 閱讀 1925

#include 

#include

#include

using

namespace

std;

const

int maxn = 111;

const

int inf = 0x3f3f3f3f;

int map[maxn][maxn];//鄰接矩陣存圖

int max[maxn][maxn];//表示最小生成樹中i到j的最大邊權

bool used[maxn][maxn];//判斷該邊是否加入最小生成樹,來記錄最小生成樹的那個邊集

int pre[maxn]; // 父親陣列

int dis[maxn]; // 距離陣列

void init(int n) // 初始化map陣列

void read(int m) // 讀入邊

}int prim(int n)

pre[1] = 0; // 1本身

dis[1] = 0;

vis[1] = true;

for (int i = 2; i <= n; i++) // 考察剩下的 n - 1個點

}if (min_dis == inf) return -1;//如果不存在最小生成樹

ans += min_dis;

vis[k] = true; // 將找到的點加入邊集

used[k][pre[k]] = used[pre[k]][k] = true; // 最小生成樹邊集

for (int j = 1; j <= n; j++) // 更新dis陣列和最小瓶頸路}}

return ans;//最小生成樹的權值之和

}int smst(int n, int min_ans)//min_ans 是最小生成樹的權值和

void solve(int n)

if (smst(n, ans) == ans)

printf("not unique!\n");

else

printf("%d\n", ans);

}int main()

return

0;}

最小生成樹 次小生成樹

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

次小生成樹

演算法引入 設g v,e,w 是連通的無向圖,t是圖g的一棵最小生成樹 如果有另一棵樹t1,滿足不存在樹t t t1 則稱t1是圖g的次小生成樹 演算法思想 鄰集的概念 由t進行一次可行交換得到的新的生成樹所組成的集合,稱為樹t的鄰集,記為n t 設t是圖g的最小生成樹,如果t1滿足 t1 min,...

次小生成樹

分類 圖論 2013 02 12 15 03 32人閱讀收藏 舉報次小生成樹 在求最小生成樹時,用陣列path i j 來表示mst中i到j最大邊權。求完後,直接列舉所有不在mst中的邊,把它加入到mst中構成一棵新的樹,且該樹有環,此環是由剛加入的邊 i,j 造成的,所以可以通過刪除path i ...