Ruta de costo máximo desde el Node de origen hasta el Node de destino a través de un máximo de K Nodes intermedios

Dado un gráfico ponderado dirigido que consta de N vértices y una array Edges[][] , donde cada fila representa dos vértices conectados por un borde y el peso de ese borde, la tarea es encontrar la ruta con la suma máxima de pesos de un vértice de origen dado src a un vértice de destino dado dst , formado por un máximo de K vértices intermedios. Si no existe tal ruta, imprima -1 .

Ejemplos:

Entrada: N = 3, Edges[][] = {{0, 1, 100}, {1, 2, 100}, {0, 2, 500}}, src = 0, dst = 2, K = 0
Salida : 500
Explicación:
 

Ruta 0 → 2: La ruta con peso máximo y como máximo 0 Nodes intermedios es de peso 500.

Entrada: N = 3, Edges[][] = {{0, 1, 100}, {1, 2, 100}, {0, 2, 500}}, src = 0, dst = 2, K = 0
Salida : 500
Explicación:
 

Camino 0 → 2: El camino con peso máximo y como máximo 1 Node intermedio es de peso 500.

 

Enfoque: el problema dado se puede resolver utilizando BFS (búsqueda primero en amplitud) transversal . Siga los pasos a continuación para resolver el problema:

  • Inicialice la variable, digamos ans , para almacenar la distancia máxima entre el origen y el Node de destino que tiene como máximo K Nodes intermedios.
  • Inicialice una lista de adyacencia del gráfico usando los bordes.
  • Inicialice una cola vacía e inserte el vértice de origen en ella . Inicialice una variable, digamos lvl , para almacenar la cantidad de Nodes presentes entre src y dst .
  • Mientras la cola no esté vacía y el lvl sea menor que K + 2 , realice los siguientes pasos:
    • Almacene el tamaño de la cola en una variable, digamos S .
    • Iterar sobre el rango [1, S] y realizar los siguientes pasos:
      • Extraiga el elemento frontal de la cola y guárdelo en una variable, digamos T .
      • Si T es el vértice dst , actualice el valor de ans como el máximo de ans y la distancia actual T.segundo .
      • Recorra todos los vecinos del Node emergente actual y verifique si la distancia de su vecino es mayor que la distancia actual o no. Si se encuentra que es cierto, entonces empújelo en la cola y actualice su distancia.
    • Aumenta el valor de lvl en 1 .
  • Después de completar los pasos anteriores, imprima el valor de ans como la distancia máxima resultante.

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

C++

// C++ program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the longest distance
// from source to destination with at
// most K intermediate nodes
int findShortestPath(
    int n, vector<vector<int> >& edges,
    int src, int dst, int K)
{
    // Initialize the adjacency list
    vector<vector<pair<int, int> > > adjlist(
        n, vector<pair<int, int> >());
 
    // Initialize a queue to perform BFS
    queue<pair<int, int> > q;
 
    unordered_map<int, int> mp;
 
    // Store the maximum distance of
    // every node from source vertex
    int ans = INT_MIN;
 
    // Initialize adjacency list
    for (int i = 0; i < edges.size(); i++) {
 
        auto edge = edges[i];
 
        adjlist[edge[0]].push_back(
            make_pair(edge[1], edge[2]));
    }
 
    // Push the first element into queue
    q.push({ src, 0 });
 
    int level = 0;
 
    // Iterate until the queue becomes empty
    // and the number of nodes between src
    // and dst vertex is at most to K
    while (!q.empty() && level < K + 2) {
 
        // Current size of the queue
        int sz = q.size();
 
        for (int i = 0; i < sz; i++) {
 
            // Extract the front
            // element of the queue
            auto pr = q.front();
 
            // Pop the front element
            // of the queue
            q.pop();
 
            // If the dst vertex is reached
            if (pr.first == dst)
                ans = max(ans, pr.second);
 
            // Traverse the adjacent nodes
            for (auto pr2 : adjlist[pr.first]) {
 
                // If the distance is greater
                // than the current distance
                if (mp.find(pr2.first)
                        == mp.end()
                    || mp[pr2.first]
                           > pr.second
                                 + pr2.second) {
 
                    // Push it into the queue
                    q.push({ pr2.first,
                             pr.second
                                 + pr2.second });
                    mp[pr2.first] = pr.second
                                    + pr2.second;
                }
            }
        }
 
        // Increment the level by 1
        level++;
    }
 
    // Finally, return the maximum distance
    return ans != INT_MIN ? ans : -1;
}
 
// Driver Code
int main()
{
    int n = 3, src = 0, dst = 2, k = 1;
    vector<vector<int> > edges
        = { { 0, 1, 100 },
            { 1, 2, 100 },
            { 0, 2, 500 } };
 
    cout << findShortestPath(n, edges,
                             src, dst, k);
 
    return 0;
}

Python3

# Python3 program for the above approach
from collections import deque
 
# Function to find the longest distance
# from source to destination with at
# most K intermediate nodes
def findShortestPath(n, edges, src, dst, K):
     
    # Initialize the adjacency list
    adjlist = [[] for i in range(n)]
     
    # Initialize a queue to perform BFS
    q = deque()
 
    mp = {}
 
    # Store the maximum distance of
    # every node from source vertex
    ans = -10**9
 
    # Initialize adjacency list
    for i in range(len(edges)):
        edge = edges[i]
        adjlist[edge[0]].append([edge[1],
                                 edge[2]])
 
    # Push the first element into queue
    q.append([src, 0])
 
    level = 0
 
    # Iterate until the queue becomes empty
    # and the number of nodes between src
    # and dst vertex is at most to K
    while (len(q) > 0 and level < K + 2):
 
        # Current size of the queue
        sz = len(q)
 
        for i in range(sz):
             
            # Extract the front
            # element of the queue
            pr = q.popleft()
             
            # Pop the front element
            # of the queue
            # q.pop()
 
            # If the dst vertex is reached
            if (pr[0] == dst):
                ans = max(ans, pr[1])
 
            # Traverse the adjacent nodes
            for pr2 in adjlist[pr[0]]:
                 
                # If the distance is greater
                # than the current distance
                if ((pr2[0] not in mp) or
                  mp[pr2[0]] > pr[1] + pr2[1]):
                       
                    # Push it into the queue
                    q.append([pr2[0], pr[1] + pr2[1]])
                    mp[pr2[0]] = pr[1] + pr2[1]
 
        # Increment the level by 1
        level += 1
 
    # Finally, return the maximum distance
    return ans if ans != -10**9 else -1
 
# Driver Code
if __name__ == '__main__':
     
    n, src, dst, k = 3, 0, 2, 1
 
    edges= [ [ 0, 1, 100 ],
             [ 1, 2, 100 ],
             [ 0, 2, 500 ] ]
 
    print(findShortestPath(n, edges,src, dst, k))
 
# This code is contributed by mohit kumar 29
Producción: 

500

 

Complejidad temporal: O(N + E)
Espacio auxiliar: O(N)

Publicación traducida automáticamente

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