【问题标题】:What's the maximum number of nodes on a path?路径上的最大节点数是多少?
【发布时间】:2015-11-14 12:57:52
【问题描述】:

我遇到以下问题:

有很多节点,其中一些已经连接,但不是全部。我们必须添加连接,以便每个节点都与任何其他节点连接(不需要直接)。我们不想更改任何现有的连接。 节点必须用最少的线路连接(当前连接已经遵循此规则)。同样,从一个节点到另一个节点的路径必须经过最少数量的其他节点。当一切都以最佳方式连接时,我们想知道任何路径上的最大节点数。

输入:
以下数据由用户输入给出:
• 你得到两个整数:节点数 1 ≤ p ≤ 1.000.000 和 number 0 ≤ l ≤ p - 1 个现有连接。
• 然后 l 每两个行整数 a 和 b 介于 0 和 p - 1(含)之间,表示连接的端点。

输出:
输出应该是一个整数,表示任何路径上的最大节点数。(所以没有开始和端点)

例如当我们输入 p = 6, l = 4 和连接 2-0, 1-0, 5-3 和 4-3输出应该是 2。

我已经用 C++ 编写了一个程序,它执行以下操作:

int main(){

    int p, l;

    cin >> p >> l;

    for (int i = 0; i < l; i++){

        int a, b;

        cin >> a >> b;

        // store the connection a,b somehow

    }

    // solve the problem

    cout << answer << endl;

}

我想将连接存储在一个 p - 1 乘以 p - 1 的数组中,如果该行存在则为 1,否则为 0。此外,我需要一些东西来决定如何以最佳方式建立连接并计算每条路径上的最大节点数量。我只被允许使用 C++ 的标准库。

有人可以帮我解决这个问题吗?提前致谢!

【问题讨论】:

  • "节点必须连接最少的线路(当前连接已经遵循此规则)。从一个节点到另一个节点的路径必须通过最少数量的其他节点。这对我来说似乎很矛盾。为了满足第二个,您需要一个完全连接的图,即从每个节点到其他节点的直线,没有中间节点。但这会使行数最大化。
  • 它必须变成一个图,其中每个节点到任何其他节点都有一条路径。所以没有cykels。因为 cykel 意味着不需要的边缘

标签: c++ graph tree


【解决方案1】:

这听起来像是一个基本的算法作业......

给定您的现有图,找到最大路径。除非您只有两个节点,否则这将是您的答案。

将所有新节点连接到不是最大路径叶节点的任何节点。

(连接节点的线称为“边”。)

如果我误解了您的问题,请告诉我。

编辑 这是一个简单的图表。 最大路径是 (a,b,c) [与 (c,b,a) 相同——我们总是对两个叶子进行排序,以便最小的在前]。

(a)--(b)--(c)

我可以通过选择任何 leaf 节点(一个恰好有 1 条边的节点)并找到通往另一个叶节点的路来找到它。 最远的叶节点将是距该节点的最长/最大路径。

从你刚刚找到的叶子节点再做一遍,你将得到整个图的最长/最大路径。

让我们来看看它是如何与新图表一起工作的:

(a)--(b)--(c)--(d)--(e)--(f)
           |
          (s)

我将从节点开始。如果我找到最长的路径,我会找到节点(f)。节点 (f) 必须是图中最长路径上的端点之一。 (我会让你想想为什么。)

现在,我从节点 (f) 重新开始。从 (f) 到 (a) 的最长路径。我现在有图中最长的路径:(a,b,c,d,e,f)。

这是另一个图表:

(a)--(b)--(c)
      |
     (d)

有许多最长的路径可供选择。 (a,b,c)、(a,b,d) 和 (c,b,d)。重要的是它们都存在并且具有相同的长度。

现在,我应该将 new 节点 (e) 连接到哪个节点,以免更改最长路径?简单:

     (e)
      |
(a)--(b)--(c)
      |
     (d)

您可以通过仅将新节点附加到非叶节​​点的节点来保证这一点。

至于您关于如何表示图形的问题,您的想法会很好,但请记住,您有 p 个节点,而不是 p-1。因此,例如,我可以将我的 3 节点图表示为:

       from
      a  b  c 
   a  0  1  0
to b  1  0  1
   c  0  1  0

注意列:a 只通向另一个节点。同样,c 只通向另一个节点。 但是,b 的列显示 b 导致 两个 其他节点(不止​​一个)。

因此,a 和 c 是叶子; b 不是。

如果我添加一个新节点,我只想将它连接到已经有多个节点的节点:

   a  b  c  d            a  b  c  d
a  0  1  0  0         a  0  1  0  0
b  1  0  1  0   -->   b  1  0  1  1
c  0  1  0  0         c  0  1  0  0
d  0  0  0  0         d  0  1  0  0

希望这会有所帮助。

【讨论】:

  • 是的,这是算法作业。但是我已经坚持了将近 2 天了,我并不是在问你们一个完美的工作代码,只是提示,以便我可以自己编程。
  • 问题是我看不到如何制作一个最优的连通图,所以如何判断一个节点是否不是叶子。而且我也看不到如何确定图中的最大路径。我对 p-1 x p-1 数组的想法至少是正确的吗?提前致谢
猜你喜欢
  • 2017-03-29
  • 2013-12-29
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
相关资源
最近更新 更多