我正在编写一个程序来实现 Prim的算法,用于课程的短项目的最小生成树。第一步是根据重量对边缘进行分类;我有时为此工作的代码,但并非总是如此。
以下是代码:
for(int i = 0; i < graph.edges; ++i)
{
least_remain_edge = i;
for(int k=i+1; k<graph.edges; ++k)
{
if(graph.edge[k][3]<graph.edge[least_remain_edge][3])
{
least_remain_edge = k;
}
}
if(least_remain_edge != i)
{
swap_temp = graph.edge[i][0];
graph.edge[i][0] = graph.edge[least_remain_edge][0];
graph.edge[least_remain_edge][0] = swap_temp;
}
}
graph.edge[i][3]
是weight
边缘的i
,[i][0]
是边参考/名称。它类似于冒泡排序,它在列表的其余部分中找到最小的排序,并将其放在i
位置。我不明白为什么这不能一直有效!
答案 0 :(得分:2)
当你移动元素时,你只是移动他们的名字/参考,而不是权重和你存储的任何其他东西。所以,也许做一些像
这样的事情for (int k = 0; k < 4; k++) {
swap_temp = graph.edge[i][k];
graph.edge[i][k] = graph.edge[least_remain_edge][k];
graph.edge[least_remain_edge][k] = swap_temp;
}