【发布时间】:2014-05-11 02:54:47
【问题描述】:
我正在用 C++ 实现 Prim 算法的一个简单版本,并且在将算法转换为与我非常基本的图形实现一起使用时遇到了一些困难。
我有一个边结构如下:
struct edge
{
int src;
int dest;
int weight;
};
我只是将边推送到图形类中的向量。我不确定这是否是实现 Prim 的最佳方式,但它似乎对我的最终结果是最佳的,它能够简单地打印出访问过的顶点数量和最小生成树的总权重。
我想我了解 Prim's 的基本概念,但我对几点有疑问。我所要求的只是朝着正确的方向前进。不过,特定于我的使用的伪代码将是理想的。
1) 选择一个起始顶点
2) 在从源顶点到所有其他顶点的 while 循环中,将边权重添加到某种堆中(这让我感到困惑,一些算法说初始化为无穷大,但 STL 优先级队列没有保留方法...)
3) 获取最低边缘(从优先级队列中弹出或在我考虑不周的实现中遍历向量以获得最低值...)
4) 如果已访问过最小值的目的地,则丢弃该边并尝试下一条。如果没有,则将边添加到最小生成树并标记它已访问。
我没有太多的代码,而且收益递减,所以任何建议都值得赞赏。这是我得到的:
vector<edge> graph::prims(int source, vector<edge> vt)
{
int current;
vector<bool> visited(numVert, false);
vector<unsigned int> minWeight;
minWeight.reserve(numVert);
// Intilize minWeight to a large number
for(int j=0; j < numEdges; j++)
{
minWeight[j] = 0xffffffff;
}
current = source;
// Will this even work? What if I pick the nth node...
while (current <= numEdges)
{
// This should add the edge weights to the current vertex
// to a vector so the minimum can be found
for(int i = 0; i < numVert; i++)
{
if(vt[i].src == current && visted[i] == false)
{
minWeight.push_back(vt[i].weight);
}
}
}
// Need to finish Prim's
return vt;
}
我整天都在尝试从互联网上获取代码并进行修改,但它让我无处可去。所以我最终决定自己尝试一下。不算多,但这花了我大约两个小时......
我的代码可以在Google Drive找到。
【问题讨论】: