Número de rutas más cortas distintas del Node 1 a N en un gráfico ponderado y dirigido

Dado un gráfico dirigido y ponderado de N Nodes y M aristas, la tarea es contar el número de caminos de menor longitud entre el Node 1 y N.

Ejemplos:

Entrada: N = 4, M = 5, aristas = {{1, 4, 5}, {1, 2, 4}, {2, 4, 5}, {1, 3, 2}, {3, 4, 3}}
Salida: 2
Explicación: El número de rutas más cortas del Node 1 al Node 4 es 2, con un costo de 5.

Entrada: N = 3, M = 2, bordes = {{1, 2, 4}, {1, 3, 5}}
Salida: 1

Enfoque: El problema se puede resolver mediante el algoritmo de Dijkstra . Use dos arrays, digamos dist[] para almacenar la distancia más corta desde el vértice de origen y paths[] de tamaño N , para almacenar la cantidad de caminos más cortos diferentes desde el vértice de origen hasta el vértice N. Siga estos pasos a continuación para el enfoque.

  • Inicialice una cola de prioridad , digamos pq, para almacenar el número de vértice y su valor de distancia.
  • Inicialice un vector de ceros, digamos paths[] de tamaño N , y haga que paths[1] sea igual a 1 .
  • Inicialice un vector   de números grandes (1e9), diga dist[] de tamaño N y haga que dist[1] sea igual a 0 .
  • Iterar mientras pq no está vacío.
    • Extraiga del pq y almacene el valor del vértice en una variable, digamos u , y el valor de la distancia en la variable d .
    • Si d es mayor que u , entonces continúa .
    • Para cada v de cada vértice u, si dist[v] > dist[u]+ (costo de borde de u y v), entonces disminuya dist[v] a dist[u] + (costo de borde de u y v) y asigne el número de caminos del vértice u al número de caminos del vértice v .
    • Para cada v de cada vértice u, si dist[v] = dist[u] + (costo de borde de u y v) , entonces agregue el número de caminos del vértice u al número de caminos del vértice v .
  • Finalmente, imprima rutas [N].

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;
  
const int INF = 1e9;
const int MAXN = 1e5 + 1;
vector<vector<pair<int, int> > > g(MAXN);
vector<int> dist(MAXN);
vector<int> route(MAXN);
  
// Function to count number of shortest
// paths from node 1 to node N
void countDistinctShortestPaths(
    int n, int m, int edges[][3])
{
    // Storing the graph
    for (int i = 0; i < m; ++i) {
        int u = edges[i][0],
            v = edges[i][1],
            c = edges[i][2];
        g[u].push_back({ v, c });
    }
  
    // Initializing dis array to a
    // large value
    for (int i = 2; i <= n; ++i) {
        dist[i] = INF;
    }
  
    // Initialize a priority queue
    priority_queue<pair<int, int>,
                   vector<pair<int, int> >,
                   greater<pair<int, int> > >
        pq;
    pq.push({ 0, 1 });
  
    // Base Cases
    dist[1] = 0;
    route[1] = 1;
  
    // Loop while priority queue is
    // not empty
    while (!pq.empty()) {
        int d = pq.top().first;
        int u = pq.top().second;
        pq.pop();
  
        // if d is greater than distance
        // of the node
        if (d > dist[u])
            continue;
  
        // Traversing all its neighbours
        for (auto e : g[u]) {
            int v = e.first;
            int c = e.second;
            if (c + d > dist[v])
                continue;
  
            // Path found of same distance
            if (c + d == dist[v]) {
                route[v] += route[u];
            }
  
            // New path found for lesser
            // distance
            if (c + d < dist[v]) {
                dist[v] = c + d;
                route[v] = route[u];
  
                // Pushing in priority
                // queue
                pq.push({ dist[v], v });
            }
        }
    }
}
  
// Driver Code
int main()
{
    // Given Input
    int n = 4;
    int m = 5;
    int edges[m][3] = { { 1, 4, 5 },
                        { 1, 2, 4 },
                        { 2, 4, 5 },
                        { 1, 3, 2 },
                        { 3, 4, 3 } };
  
    // Function Call
    countDistinctShortestPaths(n, m, edges);
    cout << route[n] << endl;
  
    return 0;
}
Producción:

2

Complejidad temporal: O(MLogN)
Espacio auxiliar: O(N)

Publicación traducida automáticamente

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