#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 ...