Prim算法下码的运行时间

时间:2015-12-30 11:19:23

标签: c++ algorithm graph-algorithm

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));

  }

1 个答案:

答案 0 :(得分:2)

最内层循环将占大多数节点发现。因此,外部循环将在条件if(NodeExplored[sv]==true)上失败并且不执行任何操作,因此是O(M ^ 2)时间解决方案。

可以考虑更好的方法,例如不通过所有节点的队列(因此​​外部循环将转换为while循环)。

此处提供了一个明确描述的解决方案:http://www.geeksforgeeks.org/greedy-algorithms-set-5-prims-minimum-spanning-tree-mst-2/