我编写了一个使用 Prim 方法解决 MST 的代码。我读到这种实现(使用优先级队列)应该有 O(E + VlogV) = O(VlogV) 其中 E 是边数和 V 边数但是当我查看我的代码时它根本不那样。如果有人能为我解决这个问题,我将不胜感激。
对我来说,运行时间似乎是这样的:
while 循环需要 O(E) 次(直到我们遍历所有边) 在该循环中,我们从 Q 中提取一个元素,这需要 O(logE) 时间。第二个内部循环需要 O(V) 时间(尽管我们不是每次都运行这个循环,很明显它会运行 V 次,因为我们必须添加所有顶点)
我的结论是运行时间为:O( E(logE+V) ) = O( E*V )。
这是我的代码:
#define p_int pair < int, int >
int N, M; //N - nmb of vertices, M - nmb of edges
int graph[100][100] = { 0 }; //adj. matrix
bool in_tree[100] = { false }; //if a node if in the mst
priority_queue< p_int, vector < p_int >, greater < p_int > > Q;
/*
keeps track of what is the smallest edge connecting a node in the mst tree and
a node outside the tree. First part of pair is the weight of the edge and the
second is the node. We dont remember the parent node beaceuse we dont need it :-)
*/
int mst_prim()
{
Q.push( make_pair( 0, 0 ) );
int nconnected = 0;
int mst_cost = 0;
while( nconnected < N )
{
p_int node = Q.top(); Q.pop();
if( in_tree[ node.second ] == false )
{
mst_cost += node.first;
in_tree[ node.second ] = true;
for( int i = 0; i < N; ++i )
if( graph[ node.second ][i] > 0 && in_tree[i]== false )
Q.push( make_pair( graph[ node.second ][i], i ) );
nconnected++;
}
}
return mst_cost;
}