我正在C++中實現一個簡單版本的Prim算法,並且有一些難度將算法轉化爲與我非常基本的圖形實現一起工作。Prim的算法C++
我有邊緣的結構,如下所示:
struct edge
{
int src;
int dest;
int weight;
};
我簡單地推邊緣以在該圖類的載體。我不知道這是否是實現Prim的最好方法,但它似乎對我的最終結果是最佳的,因爲它能夠簡單地打印出頂點的數量visitTed和最小生成樹的總重量。
我想我明白普里姆的基本想法,但我有幾點疑問。我所要求的只是朝着正確的方向前進。特定於我的用法的僞代碼將是理想的。
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找到。