普里姆算法

2024-06-09

我正在使用最小生成树普里姆算法 http://en.wikipedia.org/wiki/Prim%27s_algorithm在Java中使用PriorityQueue。但是,我得到的总重量(树的最小重量)是错误的。

我是否误解了总重量背后的概念,或者我的代码有问题?

public int getMinSpanningTree(Graph g) {
    int[][] matrix = g.getEdgeMatrix();
    int totalVertices = g.getNumberOfVertices();
    boolean[] visit = new boolean[totalVertices];
    int visitNum = 1;
    int totalWeight = 0;
    PriorityQueue<PriorityVertex> queue = new PriorityQueue<PriorityVertex>();

    //FIRST ITERATION
    visit[0] = true;
    for (int i = 0; i < totalVertices; i++) {
        if(matrix[0][i] > 0) {
            PriorityVertex temp = new PriorityVertex(i, g.getWeight(0,i));
            queue.add(temp);
        } 
    }

    while (visitNum < totalVertices) {
        PriorityVertex temp = queue.poll();
        visit[temp.vertex] = true;
        visitNum++;
        totalWeight = temp.priority + totalWeight;
        //RUN NEIGHBOUR VERTICES
        for (int k = 0; k < totalVertices; k++) {
           if(matrix[temp.vertex][k] > 0 && visit[k] == false) {
               PriorityVertex vertex = new PriorityVertex(k, g.getWeight(temp.vertex, k));
               queue.add(vertex);
           } 
        }
    }
    return totalWeight;
}

问题是您没有从队列中删除所有顶点实例 => 相同的顶点可以多次添加到结果中。

假设如下图:

weight(0,1) = 1
weight(0,2) = 2
weight(1,2) = 3
weight(1,3) = 4
weight(2,3) = 5

在“第一次迭代”之后,队列包含 PriorityVertex(1, 1)、PriorityVertex(2, 2)。

while 循环的迭代:

1) removed: PriorityVertex(1, 1) - edge (0,1) 
   added: PriorityVerterx(2, 3) and PriorityVertex(3, 4)
   queue: PriorityVertex(2, 2), PriorityVertex(2, 3), PriorityVertex(3, 4)

2) removed: PriorityVertex(2, 2) - edge (0,2)
   added: PriorityVertex(3, 5)
   queue: PriorityVertex(2, 3), PriorityVertex(3, 4), PriorityVertex(3, 5)

3) removed: PriorityVertex(2, 3) - edge (1,2), cycle in the result!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

普里姆算法 的相关文章

随机推荐

  • 使用 Twitter 的 Bootstrap 时,如何更改弹出窗口的内容?

    我正在使用 Twitter 的 Bootstrap js 的弹出窗口功能 我有一个按钮 当单击该按钮时 会执行以下 javascript popover anchor popover trigger manual placement bel
  • 是否可以将默认内容类型设置为“application/json;v=2.0”

    是否可以将默认内容类型设置为 application json v 2 0 我说默认是因为我使用 HttpClient 类 并且使用 DefaultRequestHeaders 将代理设置为默认值 我按照这个例子来创建我的标题https s
  • 纯 Javascript 应用程序 + Amazon S3?

    我想确认或反驳以下内容 就我到目前为止所读到的内容而言 如果您需要拥有多个客户端 每个客户端都包含私有数据 则不可能仅使用 javascript 没有服务器端逻辑 编写由 Amazon S3 提供的 Web 应用程序 该应用程序也仅将数据存
  • 不显示警报对话框

    大家好 我正在通过单击按钮在 android 中创建一个警报对话框 我使用了 XML 的 onClick 属性和调用函数 我的代码是 public void selectPhoneType View view String item Hom
  • Windows 安全登录表单?

    您知道 Windows Live 要求您提供证书的令人惊叹的形式吗 Gmail 通知程序 http toolbar google com gmail helper notifier windows html不知怎的 它也有 有什么方法可以在
  • 在 Rails 应用程序上将 HASH 保存到 Redis

    我刚刚开始使用 Redis 和 Rails 所以这可能是一个愚蠢的问题 我试图将哈希值保存到 Redis 服务器 但是当我检索它时 它只是一个字符串 IE hash field gt value field2 gt value2 redis
  • 如何检查产品是否有自定义选项?

    我正在尝试检查产品是否在代码中具有自定义选项 我的代码运行sales order place after事件 我尝试了下面的代码 但它没有返回任何内容 product gt hasCustomOptions and product gt h
  • 从 MySQL 滚动删除旧行的最佳方法是什么?

    我发现自己想要在许多应用程序中滚动删除早于 x 天的行 在高流量的桌子上最有效地执行此操作的最佳方法是什么 例如 如果我有一个存储通知的表 并且我只想将其保留 7 天 或者我只想保留 31 天的高分 现在 我保留一行存储发布的纪元时间 并运
  • 如何在Prometheus中查询容器内存限制

    我正在使用 Prometheus 工具来监控我的 Kubernetes 集群 我在部署中设置了资源限制 内存限制 并且需要配置一个面板来显示可用的总内存 请让我知道在 Prometheus 中运行以获得可用于我的部署的总内存限制所需的查询
  • 如何使用点将图表输出到 SVG 的标题居中?

    到目前为止 我尝试了这条线 但点不断将其推到一边 为我的节点腾出空间 将其推到右侧 diagram info shape plaintext label My Diagram l fontsize 13 有没有办法使用点按 pos 使标签居
  • 可扩展列表视图中的微调器?在子菜单中

    我在设置 childView 时尝试执行此操作时遇到问题 这就是我现在尝试做的事情 单击任何微调器项目时 我收到错误的令牌异常 无法添加窗口 token null 不适用于窗口 有人可以告诉我什么错了吗 gt public class Fo
  • 无法将源类型转换为目标类型编译错误

    我有这个简单的课程 public class Program private static void Main string args ClassB
  • 如何有条件地添加属性来反应 DOM 元素

    我有一个场景 我使用 React js 使用以下代码创建一个 div React createElement div div content 一些额外的 JavaScript 处理将允许我随后推断出该 div 是否需要将 className
  • 根据多列中的单元格查找匹配行值的公式

    我试图在同一行中 col1 col2 和 col3 各自匹配时查找 col4 值 我参考了这个SO Post https i stack imgur com YDaBP png因为这是一个类似的问题 但该解决方案对我不起作用 我正在寻找具体
  • 获取真实的HTML5视频宽度和高度

    我有一个视频元素 var video window content document createElement video video width width video height height video style backgro
  • Visual Studio 中 Eclipse 的 Ctrl+单击?

    After working for a few days with Eclipse Java I totally got addicted to pressing Ctrl and clicking on an identifier to
  • 具有导航架构组件的 ViewPager [重复]

    这个问题在这里已经有答案了 使用 viewpager 进行导航有什么用处吗 我找不到有关此的信息 也不明白如何做到这一点 我有一个简单的两个片段 需要放入 viewpager 中 如果可能的话可以通过导航 As per 这个问题 https
  • Morphic 中的 Morph 和 Cocoa 中的 NSView 有什么区别?

    我想了解 Morphic 的独特之处 Morphic 比 NSView 或任何其他graphics类只允许重新实现一组有限的功能 Morphic 是一个可塑性极强的 UI 构建工具包 Morphic 背后的一些设计理念明确了这一意图 包括一
  • 如何使用 spring 集成 dsl 解组 xml

    我正在研究 spring 集成 dsl 要求是从队列中读取 xml 消息 根据消息头值 我需要调用不同的服务 我能够从队列中获取消息 但无法在 dsl 中编写代码来将 xml 消息解组到对象 有人可以帮忙吗 我有我的解组器 但无法用 dsl
  • 普里姆算法

    我正在使用最小生成树普里姆算法 http en wikipedia org wiki Prim 27s algorithm在Java中使用PriorityQueue 但是 我得到的总重量 树的最小重量 是错误的 我是否误解了总重量背后的概念