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

Minimal spanning tree using prim's algorithm, don't know what is wrong

本文关键字:什么 问题 不知道 prim 算法 最小生成树 使用      更新时间:2023-10-16

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

给定建筑物中房间的数量以及房间之间走廊的数量。每个走廊连接两个房间,并给定一个重量。去任何房间都是可能的。你应该减少所有走廊的总重量,通过移除它们,打印出减少的重量。

这些假设正确吗?:

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

  2. 你可以通过得到图的最小生成树的权值,然后做完全权值减去MST的权值,结果是可以移除的走廊的权值之和。

我已经为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. 是否有任何中等大小的测试用例的MST在互联网上,我可以用它来找到问题?
  3. 有没有其他方法可以解决这个问题?我很乐意尝试任何与分级服务器。

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

  1. 建筑是一个图形,房间是顶点,走廊是连接它们的边。这是一个无向连通图。
  2. 你可以通过得到图的最小生成树的权值来解决这个问题,然后做完全权值减去MST的权值——结果是可以移除的走廊的权值之和。

是的,这两个都是正确的(对建筑不是一个以房间为顶点、走廊为边缘的图,但可以这样看)。如果你这样看,原始图的总权值和最小生成树的总权值之差就是在不使某些房间与其他房间不可达(即使图断开)的情况下,最大可能地减少权值。

我看到了两种可能性,

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

在没有进一步消息的情况下,我认为我的可能性更大。

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

因为你需要找到一个MST的权重,我不知道你怎么能不找到一个MST。所以其他的方法是寻找MST的不同算法。我想到了Kruskal的算法