我遇到以下问题:
有很多节点,其中有几个已经连接,但不是全部。我们必须添加连接,使每个节点与任何其他节点连接(不是直接连接)。我们不想更改任何现有连接。 节点必须以最少的行连接(当前连接已遵循此规则)。从一个节点到另一个节点的路径也必须通过最少量的其他节点。当所有内容以最佳方式连接时,我们想知道任何路径上的最大节点数。
输入:
以下数据由用户输入给出:
•您得到两个整数:数字1≤ p ≤1.000.000个节点和
数字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 ++的标准库。
有人可以帮帮我吗?提前谢谢!
答案 0 :(得分:1)
这听起来像一个基本的算法作业...
根据您的现有图表,找到最大路径。除非你只有两个节点,否则这就是你的答案。
将所有新节点连接到不是最大路径的叶节点的任何节点。
(连接节点的线路被称为&#34;边缘&#34;。)
如果我误解了你的问题,请告诉我。
修改强> 这是一个简单的图表。 最大路径是(a,b,c)[与(c,b,a)相同 - 我们总是对两个叶子进行排序,以便最小的首先出现。]
(a)--(b)--(c)
我可以通过选择任何 leaf 节点 - 一个只有1个边缘的节点 - 并找到另一个叶子节点的路径来找到它。 最远的叶节点将是该节点的最长/最大路径。
从刚刚找到的叶节点再次执行此操作,您将拥有整个图形的最长/最大路径。
让我们研究一下如何使用新图表:
(a)--(b)--(c)--(d)--(e)--(f)
|
(s)
我将从节点开始。如果我找到它的最长路径,我会找到node(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
希望这有帮助。