只看了大话数据结构这书里的实现方式
//最小生成树的Kruskal算法
//遍历最小堆,把能插入的边都插入就行
void Mgraph::min_span_tree_Kruskal() {
vector<Edge> v_edge;
for (int i = 0; i < this->m_edge_nums; i++) {
v_edge.push_back(this->m_edge_arr[i]);
}
sort(v_edge.begin(), v_edge.end(), Edge_compare());
//得到了最小堆数组
int* parent = new int[this->m_node_nums];
for (int i = 0; i < this->m_node_nums; i++) {
parent[i] = -1;//此时所有的节点都没有父节点
}
for (int i = 0; i < this->m_edge_nums; i++) {
int n = find_root(parent, v_edge[i].m_head);
int m = find_root(parent, v_edge[i].m_tail);
if (n != m) {
//这个边没有构成回路,加到生成树里面
parent[m] = n;
cout << "添加边,其头节点为 " << v_edge[i].m_head << "尾节点为 " << v_edge[i].m_tail << endl;
}
}
delete[] parent;
}
int Mgraph::find_root(int* parent, int i) {
while (parent[i] != -1) {
i = parent[i];
}
return i;
}
运行结果
用例和之前发的Prim算法一样