实验报告
课程名称 《算法分析与设计》 实验日期 2021 年 3 月 8 日 至 2021 年 3 月 14日
学生姓名 石晨昊 所在班级 计算机194 学号 2019212212322
实验名称 Kruskal算法
实验地点 同组人员
1.问题
采用Kruskal算法构造最小生成树的过程
2.解析
假设共有n个节点,m条边,每次从未选择过的边集E中选取权值最小的一条边,若该最小边的端点不与已选边的端点构成回路,则将该边加入到最小生成树中,重复这一步骤直到选够n-1条边或无边可选。
3.设计
void kruskal(int n, vector<edge> Edge)
{
father.resize(n);
sort(Edge.begin(), Edge.end(), compare);
for (int i = 0; i < n; ++i)
{
father[i] = i;
}
for (int i = 0; i < Edge.size() && result.size() < n-1; ++i)
{
int u = Edge[i].u;
int v = Edge[i].v;
if (findfather(u) != findfather(v)) //判断父节点是否相同
{
result.push_back(Edge[i].weight);
father[findfather(u)] = father[findfather(v)]; //将两点并入一个集合中
}
}
if (result.size() != n - 1)
{
cout << result.size() << "该图不连通" << endl;
return;
}
else
{
cout << "最小生成树的各边如下:" << endl;
for (int i = 0; i < result.size(); ++i)
{
cout << result[i] << endl;
}
}
}
4.分析
时间复杂度n^2
5.源码
[github源码地址]