【问题标题】:Minimal spanning tree using prim's algorithm, don't know what is wrong使用prim算法的最小生成树,不知道哪里错了
【发布时间】:2013-03-03 20:46:26
【问题描述】:

首先我要声明,我不是要任何代码或完整的解决方案。 我将描述问题:

给你一栋建筑的房间数量和它们之间的走廊数量。每个走廊连接 2 个房间,并被赋予重量。总是可以到达任何房间。你应该通过移除它们来减少所有走廊的总重量,打印出减少的重量。

这些假设是否正确?:

  1. 建筑物是一个图形,房间是顶点,走廊是连接它们的边。因此这是一个无向连通图。

  2. 您可以通过获取图的最小生成树的权重,然后将完整权重减去 MST 的权重来解决此问题 - 结果是可以移除的走廊权重的总和。

我已经为 MST 实现了 Prim 算法,结果对于示例案例和我在 Internet 上找到的任何其他 MST 案例都是正确的。但是,评分服务器仍然给我“错误答案”,没有其他信息。我不知道怎么了。输入中不超过 100 个顶点和 5000 条边,因此范围应该不是问题。权重是整数

5 7  
1 2 50  
2 3 40  
3 4 20  
4 5 10  
1 4 40  
3 5 30

在这种情况下,程序打印 80。完整的重量是 190,最小的重量是 110,所以我们可以删除 190 - 110 = 80

我的问题是:

  1. 您是否想到了任何明显的错误?需要注意的事项,为什么它适用于示例输入等。
  2. 互联网上是否有任何中等规模的MST 测试用例可供我用来查找问题?
  3. 还有其他方法可以解决这个问题吗?我很乐意尝试使用评分服务器。

我对图表完全陌生,所以我可能会遗漏一些东西。

【问题讨论】:

    标签: c++ graph weighted


    【解决方案1】:
    1. 建筑物是一个图形,房间是顶点,走廊是连接它们的边。因此这是一个无向连通图。
    2. 您可以通过获取图的最小生成树的权重,然后将完整权重减去 MST 的权重来解决此问题 - 结果是可以移除的走廊权重的总和。

    是的,这两个都是正确的(以建筑物不是一个以房间为顶点、走廊为边的图形为模,但可以这样看待)。如果你这样看,原始图的总权重与最小生成树的总权重之间的差异是在不使某些房间无法与其他房间接触的情况下最大可能地减少权重(即使图断开连接)。

    所以我看到了两种可能性,

    1. Prim 算法的实现中有一个细微的错误,该错误由评分服务器上的测试用例触发,而不是由您检查的测试用例触发。
    2. 评分服务器的答案有误。

    如果没有任何进一步的信息,我会认为有 1 个可能性更大。

    还有其他方法可以解决这个问题吗?我很乐意用评分服务器尝试任何事情。

    由于您需要找到 MST 的重量,所以如果不找到 MST,我不知道您怎么能做到。因此,其他方法是找到 MST 的不同算法。 Kruskal's algorithm 浮现在脑海中。

    【讨论】:

    • 感谢您的回复。我解决了问题!我发现了一个类似的问题online 并注意到在他们的测试输入中,一个边缘被多次给出,并且权重不同。评分员可能做了同样的事情,而我的算法还没有准备好——这就是我得到错误答案的原因。
    • 啊,相同的两个顶点之间的多条边当然是邻接矩阵不擅长处理的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    相关资源
    最近更新 更多