📌  相关文章
📜  最大化树的任意两个顶点之间的度的乘积之和

📅  最后修改于: 2021-04-27 23:01:50             🧑  作者: Mango

给定一个整数N ,任务是构造一个树,使得degree(u) * degree(v)对于所有有序对(u,v)都为最大,其中u!= v 。打印最大可能的总和。

例子:

Input: N = 4
Output: 26
      1
     /
    2
   /
  3
 /
4
For node 1, 1*2 + 1*2 + 1*1 = 5
For node 2, 2*1 + 2*2 + 2*1 = 8
For node 3, 2*1 + 2*2 + 2*1 = 8
For node 4, 1*1 + 1*2 + 1*2 = 5
Total sum = 5 + 8 + 8 + 5 = 26

Input: N = 6
Output: 82

方法:我们知道一棵树中所有节点的度数之和为(2 * N)– 2 ,其中N是树中节点的数量。由于必须使总和最大化,因此必须最小化叶节点的数量,因为叶节点在树的所有节点中的度数最小,并且树的形式为:

1
     /
    2
   /
  ...
 /
N

其中只有根节点和唯一叶子节点的度数为1,所有其他节点的度数为2。

下面是上述方法的实现:

C++
// C++ implementation of above approach
#include 
using namespace std;
#define ll long long int
  
// Function to return the maximum possible sum
ll maxSum(int N)
{
    ll ans = 0;
  
    for (int u = 1; u <= N; u++) {
        for (int v = 1; v <= N; v++) {
            if (u == v)
                continue;
  
            // Initialize degree for node u to 2
            int degreeU = 2;
  
            // If u is the leaf node or the root node
            if (u == 1 || u == N)
                degreeU = 1;
  
            // Initialize degree for node v to 2
            int degreeV = 2;
  
            // If v is the leaf node or the root node
            if (v == 1 || v == N)
                degreeV = 1;
  
            // Update the sum
            ans += (degreeU * degreeV);
        }
    }
  
    return ans;
}
  
// Driver code
int main()
{
    int N = 6;
    cout << maxSum(N);
}


Java
// Java implementation of above approach
class GFG
{
      
// Function to return the maximum possible sum
static int maxSum(int N)
{
    int ans = 0;
  
    for (int u = 1; u <= N; u++) 
    {
        for (int v = 1; v <= N; v++)
        {
            if (u == v)
                continue;
  
            // Initialize degree for node u to 2
            int degreeU = 2;
  
            // If u is the leaf node or the root node
            if (u == 1 || u == N)
                degreeU = 1;
  
            // Initialize degree for node v to 2
            int degreeV = 2;
  
            // If v is the leaf node or the root node
            if (v == 1 || v == N)
                degreeV = 1;
  
            // Update the sum
            ans += (degreeU * degreeV);
        }
    }
  
    return ans;
}
  
// Driver code
public static void main(String[] args)
{
    int N = 6;
    System.out.println(maxSum(N));
}
}
  
// This code is contributed by Code_Mech


Python3
# Python3 implementation of above approach 
  
# Function to return the maximum possible sum 
def maxSum(N) : 
    ans = 0; 
  
    for u in range(1, N + 1) :
        for v in range(1, N + 1) : 
            if (u == v) :
                continue; 
  
            # Initialize degree for node u to 2 
            degreeU = 2; 
  
            # If u is the leaf node or the root node 
            if (u == 1 or u == N) :
                degreeU = 1; 
  
            # Initialize degree for node v to 2 
            degreeV = 2; 
  
            # If v is the leaf node or the root node 
            if (v == 1 or v == N) :
                degreeV = 1; 
  
            # Update the sum 
            ans += (degreeU * degreeV); 
              
    return ans; 
  
# Driver code 
if __name__ == "__main__" :
      
    N = 6; 
    print(maxSum(N)); 
  
# This code is contributed by Ryuga


C#
// C# implementation of above approach
using System;
class GFG
{
      
// Function to return the maximum possible sum
static int maxSum(int N)
{
    int ans = 0;
  
    for (int u = 1; u <= N; u++) 
    {
        for (int v = 1; v <= N; v++)
        {
            if (u == v)
                continue;
  
            // Initialize degree for node u to 2
            int degreeU = 2;
  
            // If u is the leaf node or the root node
            if (u == 1 || u == N)
                degreeU = 1;
  
            // Initialize degree for node v to 2
            int degreeV = 2;
  
            // If v is the leaf node or the root node
            if (v == 1 || v == N)
                degreeV = 1;
  
            // Update the sum
            ans += (degreeU * degreeV);
        }
    }
  
    return ans;
}
  
// Driver code
static void Main()
{
    int N = 6;
    Console.WriteLine(maxSum(N));
}
}
  
// This code is contributed by Chandan_jnu


PHP


输出:
82