路径上的最大节点数是多少?

What's the maximum number of nodes on a path?

本文关键字:多少 节点 路径      更新时间:2023-10-16

我遇到以下问题:

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

输入:
以下数据由用户输入提供:
您得到两个整数:数字1≤p≤1.000.000的节点和现有连接的数量0≤lp−1
然后l行,每两个整数ab在0和p−1之间(包括0和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++的标准库。

有人能帮我做这个吗?提前感谢!

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

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

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

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

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

编辑这是一个简单的图表。最大路径是(a,b,c)[这与(c,b,a)相同--我们总是对两个叶子排序,使最小的先到]。

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

我可以通过拾取任何节点(一个正好有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)。重要的是,它们都存在并且具有相同的长度。

现在,我应该将新的节点(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

希望这能有所帮助。