回 帖 发 新 帖 刷新版面

主题:请教关于prim算法的问题

[em1]    

书上的代码:typedef struct {
   VertexType adjvex;
   VRType lowcost;
  }closedge[MAX_VERTEX_NUM];
  假设cost(u,w)表示边(u,w)上的权值,则对于集合 V-U 中每个顶点 w,
   closedge[LocateVex(G, w)].lowcost = Min{cost(u,w)|u∈U}

void MiniSpanTree_PRIM( MGraph G, VertexType u,SqList& MSTree)
 {
  // G 为数组存储表示的连通网,按普里姆算法从顶点 u 出发构
  // 造G的最小生成树,顺序表 MSTree 中记录生成树的各条边
  k = LocateVex ( G, u );
  InitList(MSTree, G.vexnum);    // 初始化生成树为空树
  for ( j=0; j<G.vexnum; ++j )    // 辅助数组初始化
   if (j!=k) closedge[j] = { u, G.arcs[k][j].adj };//{adjvex,lowcost}
   closedge[k].lowcost = 0;     // 初始状态,U={u}
  for (i=1; i<G.vexnum; ++i) {   // 选择其余 G.vexnum-1 个顶点
   k = minimum(closedge);     // 求出T的下一个结点(图中第k顶点)
   // 此时closedge[k].lowcost =
   // Min{ closedge[vi].lowcost | closedge[vi].lowcost>0, vi∈V-U }
   e.vex1 = closedge[k].adjvex;
   e.vex2 = G.vexs[k];
   e.weight = closedge[k].lowcost;
   b = ListInsert (MSTree, i, e); // e 为生成树的一条边
   closedge[k].lowcost = 0;    // 第 k 顶点并入U集
   [color=FF0000][color=FF00FF]for (j=0; j<G.vexnum; ++j)
    if (G.arcs[k][j].adj < closedge[j].lowcost) 
                   // 新顶点并入U后重新选择最小边
        closedge[j] = { G.vexs[k], G.arcs[k][j].adj };
   } // for[/color][/color]
 } // MiniSpanTree


请问红色部分代码的作用是什么
 假设一个连通网  


[img]http://club.joyes.com/images/upload9/2006/10/30/210314.gif[/img]

假设已经加入生成树的顶点为 a ,b ,c  未选入的顶点为g f e d 则红色部分代码表示c顶点到网中各个顶点的权  与 已选入的顶点到各个顶点的权进行比较求最小的权的那条边   既然已经将c并入u集了  就说明边已经确定了  为什么还要将c与各个顶点的权拿来跟其他顶点进行比较   另外我想问下
k = minimum(closedge);  这个函数是什么意思  是如何定义?

回复列表 (共6个回复)

沙发

k = minimum(closedge);  
表示从中选择最小的权值

K标志最小权值的小标

最后一段代码,没有上下文确实很难理解
简单的说从老严的174页的那个图来讲
比如先找到v1 v3(1)
然后来看V3,同样是v1到v2和v3到v2选择小的放入数组,就是把5复制进去

因为int LowCost[MAXVEX]; 
在这个LowCost里面本来放的是6,5比6小就复制进去了
这就是最后一段代码的含义了


还是不理解


来看看源代码再去解决实际问题吧
[url=http://blog.programfan.com/article.asp?id=19704]http://blog.programfan.com/article.asp?id=19704[/url]

板凳

不知道你的书上有没有这句话    :

然后,由于边(V3,V2)上的权值小于closedge[1].lowcost,则需要修改closedge[1]为边(V3,V2)及其权值。同理,修改closedge[4]和closeedge[5]    请问closedge[4]和closedge[6]  为什么要修改?   v5和v6 到v1不是都无通路  怎么判断出G.arcs[2][4].adj < closedge[4]

3 楼

晚上出去了,没看到留言,呵呵,不好意思~


于边(V3,V2)上的权值小于closedge[1].lowcost,则需要修改closedge[1]为边(V3,V2)及其权值。
这句话其实我已经在上面给你解释过了

首先他是先把点存储在一个一维数组里面
比如存在D[x]里面
请看,我们先初使化,有权值存入数组,没权值的就存入MAX,假设MAX为100
但是前提这个最大值比任何权值要大...
存如的是MAX 6 1 5 MAX MAX
然后选min最小值就是1(v1, v3)了

然后看V3,因为v3 v2(5)比v1 v2(6)小所以改变一维数组里面的值变为5
但是不管如何,4是最小的所以min选v3 v6(4)
然后再来V6,你后面的疑问也是因为没发现已经纳入路径的就不会再去理会了
而且v4和v5到v1他也根本不会检查

看看这个网站和flash希望你能明白一切,如果还是不明白那我除非拿着代码跑你家里来一笔一划的给你讲解了- - !
其实理解里面的代码跟学语文一样,一定要上下文理解,否则是打死也闷不出什么东西来,大多也就拿里面的伪代码来忽悠一下了~


[url=http://student.zjzk.cn/course_ware/data_structure/web/TU/tu7.4.2.2.htm]http://student.zjzk.cn/course_ware/data_structure/web/TU/tu7.4.2.2.htm[/url]

4 楼

[quote]其实理解里面的代码跟学语文一样,一定要上下文理解,否则是打死也闷不出什么东西来,大多也就拿里面的伪代码来忽悠一下了~[/quote]

这话说的很实在.

5 楼

终于明白了  在此感谢 xieyong456的讲解    好人啊    [em2][em2]


再次表示感谢 [em1]

6 楼

顶一下.

我来回复

您尚未登录,请登录后再回复。点此登录或注册