Graph Shortest Path Algorithm

#include <iostream>
#include <vector>
#include <queue>
#include <climits>
#include <stack>

using namespace std;

// Representing a graph as an adjacency matrix for simplicity
class Graph {
public:
    int vertices;  // Number of locations
    vector<vector<int>> adjMatrix;  // Adjacency matrix to store traffic times

    Graph(int v) : vertices(v) {
        adjMatrix.resize(v, vector<int>(v, INT_MAX)); // Initialize all distances to infinity
    }

    // Add an edge between two locations with a traffic delay time
    void addEdge(int src, int dest, int time) {
        adjMatrix[src][dest] = time;
        adjMatrix[dest][src] = time;  // Assuming it's an undirected graph
    }

    // Dijkstra's algorithm to find the shortest path
    vector<int> dijkstra(int src, vector<int>& parent) {
        vector<int> dist(vertices, INT_MAX);
        dist[src] = 0;
        priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
        pq.push({0, src});

        while (!pq.empty()) {
            int u = pq.top().second;
            pq.pop();

            // Check all the neighbors of the current node
            for (int v = 0; v < vertices; ++v) {
                if (adjMatrix[u][v] != INT_MAX) {
                    int newDist = dist[u] + adjMatrix[u][v];
                    if (newDist < dist[v]) {
                        dist[v] = newDist;
                        parent[v] = u; // Record the path
                        pq.push({dist[v], v});
                    }
                }
            }
        }

        return dist;
    }

    void displayShortestPath(int src, int dest) {
        vector<int> parent(vertices, -1); // To store the path
        vector<int> dist = dijkstra(src, parent);

        if (dist[dest] == INT_MAX) {
            cout << "No path found between location " << src << " and " << dest << endl;
            return;
        }

        cout << "Shortest time from location " << src << " to location " << dest << ": " << dist[dest] << " minutes" << endl;

        // Reconstruct and display the path
        stack<int> path;
        int current = dest;
        while (current != -1) {
            path.push(current);
            current = parent[current];
        }

        cout << "Path taken: ";
        while (!path.empty()) {
            cout << path.top() << " ";
            path.pop();
        }
        cout << endl;
    }
};

int main() {
    int locations = 5;  // Number of locations (vertices)
    Graph g(locations);

    // Adding edges with random traffic delays in minutes (you can replace it with real data)
    g.addEdge(0, 1, 10);  // Example: Bus route from location 0 to 1 with 10 minutes traffic delay
    g.addEdge(1, 2, 15);  // Example: Metro route from location 1 to 2 with 15 minutes traffic delay
    g.addEdge(2, 3, 30);  // Example: Bus route from location 2 to 3 with 30 minutes traffic delay
    g.addEdge(3, 4, 10);  // Example: Metro route from location 3 to 4 with 10 minutes traffic delay
    g.addEdge(0, 2, 50);  // Example: Bus route from location 0 to 2 with 50 minutes traffic delay
    g.addEdge(1, 3, 20);  // Example: Metro route from location 1 to 3 with 20 minutes traffic delay

    int source, destination;

    // Get user input for source and destination locations
    cout << "Enter the source location (0 to " << locations - 1 << "): ";
    cin >> source;
    cout << "Enter the destination location (0 to " << locations - 1 << "): ";
    cin >> destination;

    // Validate the input
    if (source < 0 || source >= locations || destination < 0 || destination >= locations) {
        cout << "Invalid source or destination location!" << endl;
        return 1;
    }

    // Display shortest time and path from source to destination
    g.displayShortestPath(source, destination);

    return 0;
}
        

Output will appear here after running the code.