Cuente los Nodes en el árbol dado cuyo peso es un número perfecto

Dado un árbol y los pesos de todos los Nodes, la tarea es contar el número de Nodes cuyo peso es un número perfecto .

Un número perfecto es un entero positivo que es igual a la suma de sus divisores propios

Ejemplos:

Aporte: 
 

Salida:
Explicación: 
No hay ningún Node con un peso que sea un número perfecto.

Enfoque: 
para resolver este problema, realizamos un recorrido transversal de búsqueda en profundidad (DFS) en el árbol y, para cada Node, verificamos si su peso es un número perfecto o no . Seguimos incrementando el contador cada vez que se obtiene tal peso. El valor final de ese contador después de completar todo el recorrido del árbol es la respuesta.
A continuación se muestra la implementación del enfoque anterior:

C++

// C++ implementation to Count the nodes in the
// given tree whose weight is a Perfect Number
 
#include <bits/stdc++.h>
using namespace std;
 
int ans = 0;
vector<int> graph[100];
vector<int> weight(100);
 
// Function that returns true if n is perfect
bool isPerfect(long long int n)
{
    // Variable to store sum of divisors
    long long int sum = 1;
 
    // Find all divisors and add them
    for (long long int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            if (i * i != n)
                sum = sum + i + n / i;
            else
                sum = sum + i;
        }
    }
 
    // Check if sum of divisors is equal to
    // n, then n is a perfect number
    if (sum == n && n != 1)
        return true;
 
    return false;
}
 
// Function to perform dfs
void dfs(int node, int parent)
{
 
    // If weight of the current node
    // is a perfect number
    if (isPerfect(weight[node]))
        ans += 1;
 
    for (int to : graph[node]) {
        if (to == parent)
            continue;
        dfs(to, node);
    }
}
 
// Driver code
int main()
{
 
    // Weights of the node
    weight[1] = 5;
    weight[2] = 10;
    weight[3] = 11;
    weight[4] = 8;
    weight[5] = 6;
 
    // Edges of the tree
    graph[1].push_back(2);
    graph[2].push_back(3);
    graph[2].push_back(4);
    graph[1].push_back(5);
 
    dfs(1, 1);
    cout << ans;
 
    return 0;
}

Java

// Java implementation to Count the nodes in the
// given tree whose weight is a Perfect Number
 
import java.util.*;
 
class GFG{
 
static int ans = 0;
static Vector<Integer> []graph = new Vector[100];
static int []weight = new int[100];
 
// Function that returns true if n is perfect
static boolean isPerfect(int n)
{
    // Variable to store sum of divisors
    int sum = 1;
 
    // Find all divisors and add them
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            if (i * i != n)
                sum = sum + i + n / i;
            else
                sum = sum + i;
        }
    }
 
    // Check if sum of divisors is equal to
    // n, then n is a perfect number
    if (sum == n && n != 1)
        return true;
 
    return false;
}
 
// Function to perform dfs
static void dfs(int node, int parent)
{
 
    // If weight of the current node
    // is a perfect number
    if (isPerfect(weight[node]))
        ans += 1;
 
    for (int to : graph[node]) {
        if (to == parent)
            continue;
        dfs(to, node);
    }
}
 
// Driver code
public static void main(String[] args)
{
 
    for (int i = 0; i < graph.length; i++)
        graph[i] = new Vector<Integer>();
         
    // Weights of the node
    weight[1] = 5;
    weight[2] = 10;
    weight[3] = 11;
    weight[4] = 8;
    weight[5] = 6;
 
    // Edges of the tree
    graph[1].add(2);
    graph[2].add(3);
    graph[2].add(4);
    graph[1].add(5);
 
    dfs(1, 1);
    System.out.print(ans);
 
}
}
 
// This code contributed by Princi Singh

Python3

# Python3 implementation to
# Count the Nodes in the given
# tree whose weight is a Perfect
# Number
 
graph = [[] for i in range(100)]
weight = [0] * 100
ans = 0
 
# Function that returns
# True if n is perfect
def isPerfect(n):
   
    # Variable to store
    # sum of divisors
    sum = 1;
 
    # Find all divisors
    # and add them
    i = 2;
     
    while(i * i < n):
        if (n % i == 0):
            if (i * i != n):
                sum = sum + i + n / i;
            else:
                sum = sum + i;
        i += 1;
 
    # Check if sum of divisors
    # is equal to n, then n is
    # a perfect number
    if (sum == n and n != 1):
        return True;
 
    return False;
 
# Function to perform dfs
def dfs(Node, parent):
   
    # If weight of the current
    # Node is a perfect number
    global ans;
     
    if (isPerfect(weight[Node])):
        ans += 1;
 
    for to in graph[Node]:
        if (to == parent):
            continue;
        dfs(to, Node);
 
# Driver code
# Weights of the Node
weight[1] = 5;
weight[2] = 10;
weight[3] = 11;
weight[4] = 8;
weight[5] = 6;
 
# Edges of the tree
graph[1].append(2);
graph[2].append(3);
graph[2].append(4);
graph[1].append(5);
 
dfs(1, 1);
print(ans);
 
# This code is contributed by 29AjayKumar

C#

// C# implementation to count the
// nodes in the given tree whose
// weight is a Perfect Number
using System;
using System.Collections.Generic;
 
class GFG{
 
static int ans = 0;
static List<int> []graph = new List<int>[100];
static int []weight = new int[100];
 
// Function that returns true
// if n is perfect
static bool isPerfect(int n)
{
     
    // Variable to store sum of
    // divisors
    int sum = 1;
 
    // Find all divisors and add them
    for(int i = 2; i * i <= n; i++)
    {
       if (n % i == 0)
       {
           if (i * i != n)
               sum = sum + i + n / i;
           else
               sum = sum + i;
       }
    }
 
    // Check if sum of divisors is equal
    // to n, then n is a perfect number
    if (sum == n && n != 1)
        return true;
    return false;
}
 
// Function to perform dfs
static void dfs(int node, int parent)
{
 
    // If weight of the current node
    // is a perfect number
    if (isPerfect(weight[node]))
        ans += 1;
 
    foreach(int to in graph[node])
    {
        if (to == parent)
            continue;
        dfs(to, node);
    }
}
 
// Driver code
public static void Main(String[] args)
{
 
    for(int i = 0; i < graph.Length; i++)
       graph[i] = new List<int>();
         
    // Weights of the node
    weight[1] = 5;
    weight[2] = 10;
    weight[3] = 11;
    weight[4] = 8;
    weight[5] = 6;
 
    // Edges of the tree
    graph[1].Add(2);
    graph[2].Add(3);
    graph[2].Add(4);
    graph[1].Add(5);
 
    dfs(1, 1);
    Console.Write(ans);
}
}
 
// This code is contributed by amal kumar choubey

Javascript

<script>
 
// Javascript implementation to Count the nodes in the
// given tree whose weight is a Perfect Number
 
var ans = 0;
var graph = Array.from(Array(100), ()=>Array());
var weight = Array.from(Array(100), ()=>Array());
 
// Function that returns true if n is perfect
function isPerfect(n)
{
    // Variable to store sum of divisors
    var sum = 1;
 
    // Find all divisors and add them
    for (var i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            if (i * i != n)
                sum = sum + i + n / i;
            else
                sum = sum + i;
        }
    }
 
    // Check if sum of divisors is equal to
    // n, then n is a perfect number
    if (sum == n && n != 1)
        return true;
 
    return false;
}
 
// Function to perform dfs
function dfs( node,  parent)
{
 
    // If weight of the current node
    // is a perfect number
    if (isPerfect(weight[node]))
        ans += 1;
 
    graph[node].forEach(to => {
         
        if (to != parent)
            dfs(to, node);
    });
}
 
// Driver code
// Weights of the node
weight[1] = 5;
weight[2] = 10;
weight[3] = 11;
weight[4] = 8;
weight[5] = 6;
// Edges of the tree
graph[1].push(2);
graph[2].push(3);
graph[2].push(4);
graph[1].push(5);
dfs(1, 1);
document.write( ans);
 
 
</script>
Producción: 

1

 

Análisis de Complejidad:

Complejidad temporal : O(N*logV), donde V es el peso máximo de un Node en el árbol

En DFS, cada Node del árbol se procesa una vez y, por lo tanto, la complejidad debida al dfs es O(N) si hay un total de N Nodes en el árbol. Además, al procesar cada Node, para comprobar si el valor del Node es un número perfecto o no, se llama a la función isPerfect(V) donde V es el peso del Node y esta función tiene una complejidad de O(logV) , por lo tanto, para cada Node, hay una complejidad adicional de O (logV). Por lo tanto, la complejidad del tiempo es O(N*logV).

Espacio Auxiliar : O(1).

No se requiere ningún espacio adicional, por lo que la complejidad del espacio es constante.

Publicación traducida automáticamente

Artículo escrito por saurabhshadow y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *