【题目见LibreOJ#123.最小生成树】
所谓最小生成树,是给定一个图G = (V, E),在边集E中取|V| - 1条边时整个图连通且无环,其中边权和最小的边集E'称作图G的最小生成树,我在这里简单介绍两种经典算法:Kruskal算法和Prim算法。
其中,Kruskal算法代码如下:
int n, m, ans;
int f[Vmax];
struct Edge { int from, to, weight; };
vector<Edge> edge;
bool compare(Edge a, Edge b)
{
return a.weight < b.weight;
}
int getfather(int point)
{
return f[point] == point ? point : f[point] = getfather(f[point]);
}
void Kruskal()
{
sort(edge.begin(), edge.end(), compare);
int num = 0;
for (int i = 1;i <= n;i++) f[i] = i;
for (vector<Edge>::iterator i = edge.begin();i != edge.end();i++)
{
int fu = getfather(i -> from);
int fv = getfather(i -> to);
if (fu !&