prim的Algo的朴素实现应该给出O(mn)的运行时间。但是我在Prim函数中有3个for循环(使运行时间立方)。我哪里错了?
void Graph::Prim (const int src) //Nodes start from 1 to n-1
{ // n = Nodes+1.
NodeExplored[src] = true;
for(int i=1; i<n-1;++i) //n-2 iterations
{
int minIndex;
int minEW = 10000;
int svIndex;
for( int sv =1;sv < n;sv++) //To check for Explored nodes
{
if(NodeExplored[sv]==true)
{
for(auto i = G[sv].begin();i!= G[sv].end();++i)
{ //To scan through the edges from sv.
int dv = i->first; //Destination Vertex
int ew = i->second; //Edge Weight b/w sv & dv.
if(NodeExplored[dv]==false && ew < minEW)
{
minEW = ew;
minIndex = dv;
svIndex = sv;
}
}
}
}
NodeExplored[minIndex] = true;
MST[svIndex].push_back(make_pair(minIndex,minEW));
MST[minIndex].push_back(make_pair(svIndex,minEW));
}
答案 0 :(得分:2)
最内层循环将占大多数节点发现。因此,外部循环将在条件if(NodeExplored[sv]==true)
上失败并且不执行任何操作,因此是O(M ^ 2)时间解决方案。
可以考虑更好的方法,例如不通过所有节点的队列(因此外部循环将转换为while循环)。
此处提供了一个明确描述的解决方案:http://www.geeksforgeeks.org/greedy-algorithms-set-5-prims-minimum-spanning-tree-mst-2/