Verifica qué jugador visita más cantidad de Nodes

Dado un árbol con N Nodes. Dos jugadores A y B comienzan desde el Node 1 y el Node N respectivamente. A puede visitar todos los Nodes adyacentes a los Nodes ya visitados por A pero no puede visitar ningún Node que ya haya sido visitado por B y de manera similar para B también.
Gana el jugador que visita más ciudades. Encuentra el jugador que gana si ambos juegan de manera óptima.

Ejemplos: 

Input: 

Output: A wins

Enfoque: la solución óptima es que tanto el jugador comience a visitar los Nodes que se encuentran en la ruta que conecta el Node 1 y el Node N. Esto se debe a que un jugador no puede visitar los Nodes que ya visitó otro jugador, por lo que cada jugador intentará limitar la cantidad de Nodes que puede visitar otro jugador. Entonces será fácil contar la cantidad de Nodes que puede visitar cada jugador y descubrir el ganador.

El DFS se usará para encontrar la ruta entre dos Nodes y marcarlos uno por uno como 1 o 2, 1 para A y 2 para B y luego marcar todos los Nodes adyacentes no visitados con el valor respectivo y luego calcular el conteo de Nodes de A y B.

A continuación se muestra la implementación del enfoque anterior:  

C++

// C++ implementation of the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Vector to store Tree
vector<vector<int> > graph;
 
// To check if there
// is path or not
int found = 0, n;
 
// Path and temporary vector
vector<int> path, temp;
 
// Count of A and B
int c_A = 0, c_B = 0;
 
// Function to find the path connecting 1 to n
void find(int i, int prev)
{
    // Push the ith node
    temp.push_back(i);
 
    // If we reached our destination
    if (i == n) {
        path = (temp);
        return;
    }
    for (int j = 0; j < graph[i].size(); j++)
        if (graph[i][j] != prev) {
 
            // Dfs for its children
            find(graph[i][j], i);
        }
 
    // Remove the node
    temp.pop_back();
}
 
// Function to mark all the adjacent
// unvisited nodes
void mark(int i, int visited[], int c)
{
    if (!visited[i]) {
 
        // Increase the count
        if (c == 1)
            c_A++;
        else
            c_B++;
    }
 
    visited[i] = c;
 
    // Increase the count
    if (c == 1)
        c_A++;
    else
        c_B++;
 
    // Dfs for all its unvisited adjacent nodes
    for (int j = 0; j < graph[i].size(); j++)
        if (!visited[graph[i][j]])
            mark(graph[i][j], visited, c);
}
 
// Function to find the winner among the players
void findWinner()
{
    // Finds the path
    find(1, -1);
 
    int visited[n + 1] = { 0 };
 
    for (int i = 0; i < path.size(); i++) {
 
        // Mark nodes visited by
        // A as 1 and B as 2
        if (i < ceil(path.size() / 2.0))
            visited[path[i]] = 1, c_A++;
        else
            visited[path[i]] = 2, c_B++;
    }
 
    // Mark all the adjacent unvisited nodes
    for (int i = 0; i < path.size(); i++)
        mark(path[i],
             visited,
             visited[path[i]]);
 
    if (c_A > c_B)
        cout << "A wins";
    else if (c_A < c_B)
        cout << "B wins";
    else
        cout << "Draw";
}
 
// Driver code
int main()
{
    n = 7;
    graph.clear();
    graph.resize(n + 1);
 
    // Graph
    graph[6].push_back(4);
    graph[4].push_back(6);
    graph[6].push_back(5);
    graph[5].push_back(6);
    graph[5].push_back(7);
    graph[7].push_back(5);
    graph[5].push_back(2);
    graph[2].push_back(5);
    graph[3].push_back(4);
    graph[4].push_back(3);
    graph[1].push_back(4);
    graph[4].push_back(1);
 
    findWinner();
 
    return 0;
}

Java

// Java implementation of the
// above approach
import java.util.*;
class GFG{
 
// Vector to store Tree
static Vector<Integer> []graph;
 
// To check if there
// is path or not
static int found = 0, n;
 
// Path and temporary vector
static Vector<Integer> path =
       new Vector<>();
static Vector<Integer> temp =
       new Vector<>();
 
// Count of A and B
static int c_A = 0, c_B = 0;
 
// Function to find the path
// connecting 1 to n
static void find(int i,
                 int prev)
{
  // Push the ith node
  temp.add(i);
 
  // If we reached our
  // destination
  if (i == n)
  {
    path = (temp);
    return;
  }
  for (int j = 0;
           j < graph[i].size(); j++)
    if (graph[i].get(j) != prev)
    {
      // Dfs for its children
      find(graph[i].get(j), i);
    }
 
  // Remove the node
  temp.remove(temp.size() - 1);
}
 
// Function to mark all the
// adjacent unvisited nodes
static void mark(int i,
                 int visited[],
                 int c)
{
  if (visited[i] > 0)
  {
    // Increase the count
    if (c == 1)
      c_A++;
    else
      c_B++;
  }
 
  visited[i] = c;
 
  // Increase the count
  if (c == 1)
    c_A++;
  else
    c_B++;
 
  // Dfs for all its unvisited
  // adjacent nodes
  for (int j = 0;
           j < graph[i].size(); j++)
    if (visited[graph[i].get(j)] > 0)
      mark(graph[i].get(j),
           visited, c);
}
 
// Function to find the winner
// among the players
static void findWinner()
{
  // Finds the path
  find(1, -1);
 
  int visited[] = new int[n + 1];
 
  for (int i = 0;
           i < path.size(); i++)
  {
    // Mark nodes visited by
    // A as 1 and B as 2
    if (i < Math.ceil(path.size() / 2.0))
    {
      visited[path.get(i)] = 1;
      c_A++;
    }
    else
    {
      visited[path.get(i)] = 2;
      c_B++;
    }
  }
 
  // Mark all the adjacent
  // unvisited nodes
  for (int i = 0;
           i < path.size(); i++)
    mark(path.get(i),
         visited,
         visited[path.get(i)]);
 
  if (c_A > c_B)
    System.out.print("A wins");
  else if (c_A < c_B)
    System.out.print("B wins");
  else
    System.out.print("Draw");
}
 
// Driver code
@SuppressWarnings("unchecked")
public static void main(String[] args)
{
  n = 7;
  graph = new Vector[n + 1];
  for (int i = 0;
           i < graph.length; i++)
    graph[i] = new Vector<Integer>();
   
  // Graph
  graph[6].add(4);
  graph[4].add(6);
  graph[6].add(5);
  graph[5].add(6);
  graph[5].add(7);
  graph[7].add(5);
  graph[5].add(2);
  graph[2].add(5);
  graph[3].add(4);
  graph[4].add(3);
  graph[1].add(4);
  graph[4].add(1);
 
  findWinner();
}
}
 
// This code is contributed by Amit Katiyar

Python3

# Python3 implementation of the above approach
from math import ceil, floor
 
# Vector to store Tree
graph = [[] for i in range(1000)]
 
# To check if there
# is path or not
found = 0
n = 0
 
# Path and temporary vector
path = []
temp = []
 
# Count of A and B
c_A = 0
c_B = 0
 
# Function to find the path connecting 1 to n
def find(i, prev):
    global c_A, c_B, path
     
    # Push the ith node
    temp.append(i)
 
    # If we reached our destination
    if (i == n):
        path = temp
        return
 
    for j in graph[i]:
        if j != prev:
 
            # Dfs for its children
            find(j, i)
 
    # Remove the node
    del temp[-1]
 
# Function to mark all the adjacent
# unvisited nodes
def mark(i, visited, c):
    global c_B, c_A
 
    if visited[i] == 0:
 
        # Increase the count
        if (c == 1):
            c_A += 1
        else:
            c_B += 1
 
    visited[i] = c
 
    # Increase the count
    if (c == 1):
        c_A += 1
    else:
        c_B += 1
 
    # Dfs for all its unvisited adjacent nodes
    for j in graph[i]:
        if (visited[j] == 0):
            mark(j, visited, c)
 
# Function to find the winner among the players
def findWinner():
    global c_B, c_A, path
     
    # Finds the path
    find(1, -1)
 
    visited = [0 for i in range(n + 1)]
 
    for i in range(len(path)):
 
        # Mark nodes visited by
        # A as 1 and B as 2
        if (i < ceil(len(path) / 2.0)):
            visited[path[i]] = 1
            c_A += 1
        else:
            visited[path[i]] = 2
            c_B += 1
 
    # Mark all the adjacent unvisited nodes
    for i in path:
        mark(i, visited, visited[i])
 
    if (c_A > c_B):
        print("A wins")
    elif (c_A < c_B):
        print("B wins")
    else:
        print("Draw")
 
# Driver code
n = 7
 
# Graph
graph[6].append(4)
graph[4].append(6)
graph[6].append(5)
graph[5].append(6)
graph[5].append(7)
graph[7].append(5)
graph[5].append(2)
graph[2].append(5)
graph[3].append(4)
graph[4].append(3)
graph[1].append(4)
graph[4].append(1)
 
findWinner()
 
# This code is contributed by Mohit Kumar

C#

// C# implementation of the
// above approach
using System;
using System.Collections.Generic;
class GFG{
 
// List to store Tree
static List<int> []graph;
 
// To check if there
// is path or not
static int found = 0, n;
 
// Path and temporary vector
static List<int> path =
       new List<int>();
static List<int> temp =
       new List<int>();
 
// Count of A and B
static int c_A = 0, c_B = 0;
 
// Function to find the path
// connecting 1 to n
static void find(int i,
                 int prev)
{
  // Push the ith node
  temp.Add(i);
 
  // If we reached our
  // destination
  if (i == n)
  {
    path = (temp);
    return;
  }
  for (int j = 0;
           j < graph[i].Count; j++)
    if (graph[i][j] != prev)
    {
      // Dfs for its children
      find(graph[i][j], i);
    }
 
  // Remove the node
  temp.Remove(temp.Count - 1);
}
 
// Function to mark all the
// adjacent unvisited nodes
static void mark(int i,
                 int []visited,
                 int c)
{
  if (visited[i] > 0)
  {
    // Increase the count
    if (c == 1)
      c_A++;
    else
      c_B++;
  }
 
  visited[i] = c;
 
  // Increase the count
  if (c == 1)
    c_A++;
  else
    c_B++;
 
  // Dfs for all its unvisited
  // adjacent nodes
  for (int j = 0;
           j < graph[i].Count; j++)
    if (visited[graph[i][j]] > 0)
      mark(graph[i][j],
           visited, c);
}
 
// Function to find the winner
// among the players
static void findWinner()
{
  // Finds the path
  find(1, -1);
 
  int []visited = new int[n + 1];
 
  for (int i = 0;
           i < path.Count; i++)
  {
    // Mark nodes visited by
    // A as 1 and B as 2
    if (i < Math.Ceiling(path.Count / 2.0))
    {
      visited[path[i]] = 1;
      c_A++;
    }
    else
    {
      visited[path[i]] = 2;
      c_B++;
    }
  }
 
  // Mark all the adjacent
  // unvisited nodes
  for (int i = 0;
           i < path.Count; i++)
    mark(path[i],
         visited,
         visited[path[i]]);
 
  if (c_A > c_B)
    Console.Write("A wins");
  else if (c_A < c_B)
    Console.Write("B wins");
  else
    Console.Write("Draw");
}
 
// Driver code
 
public static void Main(String[] args)
{
  n = 7;
  graph = new List<int>[n + 1];
   
  for (int i = 0;
           i < graph.Length; i++)
    graph[i] = new List<int>();
   
  // Graph
  graph[6].Add(4);
  graph[4].Add(6);
  graph[6].Add(5);
  graph[5].Add(6);
  graph[5].Add(7);
  graph[7].Add(5);
  graph[5].Add(2);
  graph[2].Add(5);
  graph[3].Add(4);
  graph[4].Add(3);
  graph[1].Add(4);
  graph[4].Add(1);
 
  findWinner();
}
}
 
// This code is contributed by shikhasingrajput

Javascript

<script>
 
// Javascript implementation of the
// above approach
 
// Vector to store Tree
let graph;
 
// To check if there
// is path or not
let found = 0, n;
 
// Path and temporary vector
let path = [];
let temp = [];
 
// Count of A and B
let c_A = 0, c_B = 0;
 
// Function to find the path
// connecting 1 to n
function find(i, prev)
{
     
    // Push the ith node
    temp.push(i);
  
    // If we reached our
    // destination
    if (i == n)
    {
        path = (temp);
        return;
    }
    for(let j = 0;
            j < graph[i].length; j++)
    {
        if (graph[i][j] != prev)
        {
            // Dfs for its children
            find(graph[i][j], i);
        }
    }
    // Remove the node
    temp.pop();
}
 
// Function to mark all the
// adjacent unvisited nodes
function mark(i, visited, c)
{
    if (visited[i] > 0)
    {
         
        // Increase the count
        if (c == 1)
            c_A++;
        else
            c_B++;
    }
     
    visited[i] = c;
     
    // Increase the count
    if (c == 1)
        c_A++;
    else
        c_B++;
     
    // Dfs for all its unvisited
    // adjacent nodes
    for(let j = 0;
            j < graph[i].length; j++)
        if (visited[graph[i][j]] > 0)
            mark(graph[i][j], visited, c);
}
 
// Function to find the winner
// among the players
function findWinner()
{
     
    // Finds the path
    find(1, -1);
     
    let visited = new Array(n + 1);
     
    for(let i = 0;
            i < path.length; i++)
    {
         
        // Mark nodes visited by
        // A as 1 and B as 2
        if (i < Math.ceil(path.length / 2.0))
        {
            visited[path[i]] = 1;
            c_A++;
        }
        else
        {
            visited[path[i]] = 2;
            c_B++;
        }
    }
     
    // Mark all the adjacent
    // unvisited nodes
    for(let i = 0;
            i < path.length; i++)
        mark(path[i], visited,
             visited[path[i]]);
     
    if (c_A > c_B)
        document.write("A wins");
    else if (c_A < c_B)
        document.write("B wins");
    else
        document.write("Draw");
}
 
// Driver code
n = 7;
graph = new Array(n + 1);
for(let i = 0;
        i < graph.length; i++)
    graph[i] = [];
 
// Graph
graph[6].push(4);
graph[4].push(6);
graph[6].push(5);
graph[5].push(6);
graph[5].push(7);
graph[7].push(5);
graph[5].push(2);
graph[2].push(5);
graph[3].push(4);
graph[4].push(3);
graph[1].push(4);
graph[4].push(1);
 
findWinner();
 
// This code is contributed by patel2127
 
</script>
Producción: 

A wins

 

Publicación traducida automáticamente

Artículo escrito por andrew1234 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 *