在 C++ 中最大化树中任意两个顶点之间度数乘积之和
给定任务是用给定的整数 N 构造一棵树,使得所有有序对 (x,y) 的 degree(x) * degree(y) 之和最大,且 x 不等于 y。
输入 −N=5
输出 −50
解释
1 \ 2 \ 3 \ 4 \ 5 Degree of 1st node = 1 Degree of 2nd node = 2 Degree of 3rd node = 2 Degree of 4th node = 2 Degree of 5th node = 1
所有有序对 (x, y) 的所有度数的乘积 −
1st node = 1*2 + 1*2 + 1*2 + 1*1 = 7 2nd node = 2*1 + 2*2 + 2*2 + 2*1 = 12 3rd node = 2*1 + 2*2 + 2*2 + 2*1 = 12 4th node = 2*1 + 2*2 + 2*2 + 2*1 = 12 5th node = 1*2 + 1*2 + 1*2 + 1*1 = 7 Total sum = 50
输入 −N=7
输出 −122
下面程序中使用的算法如下
树中所有节点的度数之和为 − (2 * N) – 2。这里 N=树中节点数。为了最大化总和,必须最小化叶节点数。
在 Max() 函数内,初始化 int sum=0 并创建嵌套循环,初始化 x=1 和 y=1,条件为 x<N 和 y<N。
在嵌套循环内,首先检查 if(x==y),如果是,则添加 continue; 语句
否则,初始化 int degree=2,并使用 if 语句检查 if(x==1 || x==n)。如果是,则将 degreeX=1。然后初始化 int degree=2,对变量 y 执行相同的操作
最后,在关闭循环之前,通过编写 sum = (degreeX + degreeY) 来更新 sum 变量
示例
#include <bits/stdc++.h> using namespace std; int Max(int N){ int sum = 0; for (int x = 1; x <= N; x++){ for (int y = 1; y <= N; y++){ if (x == y) continue; //Initializing degree for node x to 2 int degreeX = 2; //If x is the leaf node or the root node if (x == 1 || x == N) degreeX = 1; //Initializing degree for node y to 2 int degreeY = 2; //If y is the leaf node or the root node if (y == 1 || y == N) degreeY = 1; //Updating sum sum += (degreeX * degreeY); } } return sum; } //Main function int main(){ int N = 5; cout << Max(N); }
输出
如果我们运行上述代码,我们将得到以下输出:
50
广告