Prim的算法通过邻接矩阵

时间:2014-05-21 10:53:49

标签: algorithm prims-algorithm

我正在考虑使用Prim的算法来优化输水管道问题。当找到有相邻顶点的边时,我非常困惑如何初始化邻接矩阵。我想在边缘存在时加重。然而,w(Vi,Vj)本身看起来是一个权重矩阵。那么,为什么我首先需要A {Vi,Vj}。

我所要做的就是编写一种算法方法,然后继续编写程序。请告知以下是否可以?

  1. 设置邻接矩阵A {Vi,Vj}。这里Vi包含所有访问过的节点,Vj包含所访问的Vi的所有相邻节点。矩阵下方将存储与其相邻房屋相隔一定距离的所有房屋。我很困惑

    for 每个Vi:= 1到n do // Vith是存储一对房子的第i个顶点       for 每个Vj:= 1到n do // Vjth是相邻的一对房子有一些重量         如果(Vi和Vj之间存在边缘)则             设置 A {Vi,Vj}与w(Vi,Vj)         其他如果(Vi和Vj之间不存在边缘)则             设置 A [Vi,Vj]:= 0

  2. 计算最小生成树。

  3. 输出:显示所需的总水管道。

2 个答案:

答案 0 :(得分:0)

在您的问题中的图算法中,如果给出权重,除了权重之外,通常不会明确地编码邻接。相反,图形被认为是一个完整的图形(即evey顶点与任何其他顶点相邻),但对于初始图形中的非相邻顶点uv,权重被编码为'无穷大,编码为所用数据类型的最大值,在计算等中识别的一些负值。使用这种方法,不可行的边缘将永远不会被考虑,因为它们比最初问题的任何可行解决方案都更昂贵。

答案 1 :(得分:0)

  1. 是的,使用邻接矩阵是一种可行的方法,可以实现Prim的算法来构建最小生成树。运行时间为O(V ^ 2)。更具体地说,您将有一个嵌套的for循环,外部循环的成本为O(V),这是每次它拾取顶点时将最小成本加到MST上。因此,为此,您必须制作一个键数组key [v],以保持将顶点添加到树中的成本。还有一个数组mst [v]以确保在每次迭代之后,都应该访问一个顶点
    1. 然后,基于prim的算法,在每次使用最小成本键[v]拾取顶点v之后,将内部for循环添加到当前的mst中,在标记mst [v之前,下一步该怎么做]访问过吗?您应该使用“邻接矩阵”来比较/更新v的邻居添加到mst的成本。这很重要,因此,每当它选择一个顶点并将其添加到树中时,Prim都会通过从v获取的信息来更新添加到mst的顶点的成本。因此,下次它以最小成本再次拾取u时,只要再次重复直到发现所有顶点,mst [v]就会全部成立。因此,在内部for循环中,它使用表示v的行并检查v的所有邻居,它们是该行中的所有列。如果说w [i] [j]小于当前顶点j的增加成本,则key [j]。然后使用v对该顶点的权重作为该顶点的加总成本,key [j] = w [i] [j]。在访问完所有v的邻居之后,将v标记为完成。
    2. 因此素数很清楚,最好将“不存在”的边设置为权重0,因此在矩阵中,w [i] [j] = 0,这意味着顶点i和顶点j不彼此可达,并且每次您选择AV并检查其邻居时,它只会显示正值。另外,矩阵的对角线应设置为全零,因为当有理由弄清楚将已经在mst到mst中的顶点相加的代价时。总之,如果每次素数检验v的邻居,w [i] [j]
    3. 此算法的运行时间 O(V)来设置所有数组初始化,设置key [root] = 0,以及其他顶点,key [v] = inf,无穷大会增加成本mst,而mst [v]为null。
      然后 O(V)进行外循环迭代,然后在外循环内拾取顶点v,每次最小花费,因此花费O(V)可能会更好使用最小堆。然后检查v的所有邻居,它将是O(E),包括所有检查。因此迭代成本为:O(V)*(V)+ O(E),并且prim的算法成本可以由O(V ^ 2)限制