Prim算法
小弟在看Prim算法的时候,被搞的晕头转向。非常希望各位大虾能给小弟详细地解释一下。特别是看到那个将新顶点并入U后重新选择最小边那个部分,那个FOR循环究竟是怎么弄得。PRIM的思想我大概知道,就是先随机选出一个节点充当开始的节点进行走环,一路上把走过的节点标记为VISITED,并把这些VISITED后的节点放在集合U中,再在总集V里面寻找到U集合中的节点的权值最小的那条边作为最小边,并把这个节点并入U集标记为VISITED,之后就是重复上述过程。虽然能够理解文字说明,但是结合算法后我就被弄得稀里糊涂了。最好是能够配合算法的具体过程,结合一个具体的无向图,给小弟说一下。我在此感激不尽^_^
Template<class WeightType>
int MinVerTex(const Algraph<WeightType>&g,int *adjVex)
{//返回W,边<w,adjVex[ w]>为连接V-U到U的最小权值的边
int w=-1; int v;
for(v=0; v<g.NumVer(); v++)
{if(g.GetTag(v)=UNVISITED&&g.GetWeight(v,adjVer[v])>0
{
w=v; break;
}
}
for(v++; v<g.NumVer();v++)
{ if(g.GetTag(v)==UNVISITED&&g.GetWeight(v,adjVer[v])>0
&& g.GetWeight(v,adjVer[v]< g.GetWeight(w,adjVer[w])
w=v;
}
return w;
}
Template<class WeightType>
void MinSpanTreeprim(const Algraph<WeightType>&g,int u0)
{//从u0出发构造网G的最小代价生成树
assert(u0)>=0&&u0<g.NumVex();
int *adjVex;
int u, v,w;
adjVex=new int[g.NumVex()]
for(v=0; v<g.NumVer(); v++)
{ if (v!=u0)
{ adjVex[v]=u0;
g.SetTag(v,UNVISITED);
}
else
{ g.SetTag(v,VISITED);
adjVex[v]=u0;
{
}//初始化辅助数组adjVex,并对顶点作标志
for(u=1; u<g.NumVer(); v++)
{//选择生成树的其余g.NumVex()-1个顶点
w= MinVerTex<WeightType>(g,*adjVex);
if ( w=-1) return
count<<adjVex[w]<< g.GetWeight(w,adjVer[w];
g.SetTag(w,VISITED);
for(int v=g.FirstAdjVex(w); v>=0;v=g.NumAdjVex(w,v))
{ //新顶点并入U后从新选择最小边
if (g.Tag(v)==UNVISITED&&
(g.GetWeight(v,adjVer[w]< g.GetWeight(v,adjVer[v]))
‖g.GetWeight(v,adjVer[v] )=0)
adjVex[v]=w; ;//<v,w>为新最小的边
}
}
Delete []adjVex;
}