使用prim算法的最小生成树,不知道出了什么问题

时间:2013-03-03 20:46:26

标签: c++ graph weighted

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

  

您可以获得建筑物内的房间数量以及它们之间的走廊数量。每个走廊连接2个房间,并给予重量。它总是可以到达任何房间。您应该通过移除它们来减少所有走廊的全部重量,打印出减轻的重量。

这些假设是否正确?:

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

  2. 你可以通过获取图形最小生成树的权重来解决这个问题,然后做完全重量减去MST的权重 - 结果是可以移除的走廊权重之和。

  3. 我已经为MST实现了Prim算法,结果对于示例案例以及我在互联网上找到的任何其他MST案例都是正确的。但是,评分服务器仍然给我“错误答案”而没有其他信息。我不知道出了什么问题。输入中不超过100个顶点和5000个边,因此范围不应该是个问题。权重是整数<= 200。我正在使用MTS的邻接矩阵。示例输入:

    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. 互联网上是否有任何中等大小的测试用例我可以用来查找问题?
    3. 还有其他方法可以解决这个问题吗?我很乐意尝试使用评分服务器。
    4. 我对图表完全不熟悉所以我可能会遗漏一些东西。

1 个答案:

答案 0 :(得分:0)

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

是的,这两个都是正确的(以建筑物 为基础的图形而不是以房间为顶点和走廊作为边缘的图形,但可以这样看)。如果您这样查看,原始图表的总权重与最小生成树的总权重之间的差异是最大可能的权重减少,而不会使其他房间无法访问(即使图表断开连接)。

所以我看到两种可能性,

  1. 您在Prim算法的实现中有一个微妙的错误,该错误由评分服务器上的测试用例触发,但不是由您检查过的测试用例触发。
  2. 评分服务器的答案错误。
  3. 如果没有任何进一步的信息,我会考虑更多的可能性。

      

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

    由于你需要找到MST的重量,我不知道如何在没有找到MST的情况下做到这一点。因此,其他方法是使用不同的算法来查找MST。想到Kruskal's algorithm