给定N个顶点,其中N是偶数。最初,任何一个顶点之间都没有边。
您可以执行如下所示的操作:
- 在一次操作中,总节点可以分为两组,并且可以为u和v的所有可能值绘制边(u,v) ,以使u和v都属于不同的组。
任务是找到将这些顶点转换为完整图形所需的最小给定操作数。
例子:
Input: N = 4
Output: 2
Operation 1: Groups = [1, 2], [3, 4] all possible edges will be {1-4, 1-3, 2-3, 2-4}.
Operation 2: Groups = [1, 3], [2, 4] all possible edges will be {1-4, 1-3, 2-3, 2-4, 1-2, 3-4}.
Graph is now a complete graph.
Input: N = 10
Output: 4
方法:当每对顶点之间都有一条边时,一个图将被称为完整图。这里的问题可以通过分而治之的方法解决。要执行最少数量的操作,请将顶点分为两组,每组分别具有N / 2个顶点,并绘制所有可能的边。现在观察我们必须在同一组顶点之间创建边。因此,我们将它们分为两半,然后将它们放在不同的组中。
重复这些步骤,直到绘制完所有边缘为止,即最大max log2(N)倍,因为操作会将边缘分成相等大小的两半。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Function to return
// the minimum number of steps required
int minOperations(int N)
{
double x = log2(N);
int ans = ceil(x);
return ans;
}
// Driver Code
int main()
{
int N = 10;
cout << minOperations(N);
return 0;
}
Java
// Java implementation of the approach
class GFG
{
// Function to return the minimum
// number of steps required
static int minOperations(int N)
{
double x = Math.log(N) / Math.log(2);
int ans = (int)(Math.ceil(x));
return ans;
}
// Driver Code
public static void main(String[] args)
{
int N = 10;
System.out.println(minOperations(N));
}
}
// This code is contributed by Ryuga
Python3
# Python 3 implementation of the approach
from math import log2, ceil
# Function to return the minimum
# number of steps required
def minOperations(N):
x = log2(N)
ans = ceil(x)
return ans
# Driver Code
if __name__ == '__main__':
N = 10
print(minOperations(N))
# This code is contributed by
# Surendra_Gangwar
C#
// C# implementation of the approach
using System;
class GFG
{
// Function to return the minimum
// number of steps required
static int minOperations(int N)
{
double x = Math.Log(N, 2);
int ans = (int)(Math.Ceiling(x));
return ans;
}
// Driver Code
static void Main()
{
int N = 10;
Console.WriteLine(minOperations(N));
}
}
// This code is contributed by mits
PHP
Javascript
输出:
4