Check Whether the Cost of Going from any Node to any Other Node Via all Possible Paths is Same


Testing if the cost of travelling from any node to any other node by all conceivable paths is the same is the issue of determining whether the sum of weights along numerous pathways connecting every pair of nodes in a graph is equal. This problem affects a variety of industries, including optimisation techniques, data transmission systems, and transportation networks.

One approach is the Floyd−Warshall algorithm, which quickly determines all of the shortest paths between any two network nodes. This method continually evaluates intermediate nodes and updates route costs to see whether there is cost equality between pairs of nodes.Another choice is the Bellman−Ford method, which can find the shortest paths in networks with only one source node even when the edge weights between the nodes are negative. By continually relaxing edges and identifying negative weight cycles, this method offers a way to determine if the cost of commuting from any node to any other node over all pathways is constant.

Methods Used

  • Floyd−Warshall algorithm

  • Bellman−Ford algorithm

Floyd−Warshall algorithm

The shortest path costs between all pairs of nodes are found by this approach by continually assessing intermediate nodes and updating the path costs. The Floyd−Warshall method can rapidly and precisely calculate the shortest paths between any two specified nodes, which makes it suitable for dense networks.

Algorithm

  • Initialise a 2D matrix cost of size n x n to record shortest path costs.

  • Set cost diagonals to 0.

  • Update cost matrix with graph, where cost[u][v] is the edge cost from node u to v. Assign INF (infinity) to cells without direct edges.

Example

#include <iostream>
#include <vector>
#include <climits>

using namespace std;

#define INF INT_MAX

// Function to find the maximum value in a vector
int maxVal(const vector<int>& vec) {
    int max = INT_MIN;
    for (int i = 0; i < vec.size(); i++) {
        if (vec[i] > max) {
            max = vec[i];
        }
    }
    return max;
}

// Function to check whether all values in a vector are the same
bool allSame(const vector<int>& vec) {
    for (int i = 1; i < vec.size(); i++) {
        if (vec[i] != vec[0]) {
            return false;
        }
    }
    return true;
}

// Function to check whether the cost of going from any node to any other node via all possible paths is the same
bool isCostSame(const vector<vector<int>>& graph) {
    int n = graph.size();

    // Initialize a 2D vector to store the shortest path costs
    vector<vector<int>> cost(n, vector<int>(n, INF));

    // Initialize the diagonal elements as 0
    for (int i = 0; i < n; i++) {
        cost[i][i] = 0;
    }

    // Update the cost matrix with the given graph
    for (int u = 0; u < n; u++) {
        for (int v = 0; v < n; v++) {
            if (graph[u][v] != INF) {
                cost[u][v] = graph[u][v];
            }
        }
    }

    // Floyd-Warshall algorithm to find all shortest paths
    for (int k = 0; k < n; k++) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (cost[i][k] != INF && cost[k][j] != INF && cost[i][k] + cost[k][j] < cost[i][j]) {
                    cost[i][j] = cost[i][k] + cost[k][j];
                }
            }
        }
    }

    // Check whether all paths have the same cost
    for (int i = 0; i < n; i++) {
        vector<int> pathCosts;
        for (int j = 0; j < n; j++) {
            pathCosts.push_back(cost[i][j]);
        }
        if (!allSame(pathCosts)) {
            return false;
        }
    }

    return true;
}

int main() {
    // Example graph
    vector<vector<int>> graph = {
        {0, 1, INF, 2},
        {1, 0, 4, INF},
        {INF, 4, 0, 5},
        {2, INF, 5, 0}
    };

    if (isCostSame(graph)) {
        cout << "The cost of going from any node to any other node via all possible paths is the same." << endl;
    } else {
        cout << "The cost of going from any node to any other node via all possible paths is not the same." << endl;
    }

    return 0;
}

Output

The cost of going from any node to any other node via all possible paths is not the same.

Bellman−Ford method

The Bellman−Ford method is a well−known example of a single−source shortest path algorithm, and it is particularly useful since it can process networks with negative edge weights and identify negative weight cycles. This approach relies on dynamic programming techniques to determine the shortest pathways by progressively loosening their constraints. At the outset of the procedure, the distance between the source node and each of the other nodes is set to infinity. Then, it iteratively relaxes all the edges to shorten the pathways until the best ones are found. Despite its adaptability, the Bellman−Ford technique may not be as effective as other algorithms for dense networks due to its temporal complexity. This is especially true for graphs with negative edge weights.

Algorithm

  • Create an edge structure containing src, dest, and weight properties.

  • Create a boolean function isCostSame that accepts a vector of Edge objects edges and the number of nodes numNodes.

  • Initialise a vector dist of size numNodes and set all elements to INF except the source node, which is 0.

Example

#include <iostream>
#include <vector>
#include <climits>

using namespace std;

#define INF INT_MAX

// Structure to represent an edge
struct Edge {
    int src, dest, weight;
};

// Function to check whether the cost of going from any node to any other node via all possible paths is the same
bool isCostSame(const vector<Edge>& edges, int numNodes) {
    vector<int> dist(numNodes, INF);
    dist[0] = 0; // Set the distance of the source node to 0

    // Relax all edges (V-1) times
    for (int i = 0; i < numNodes - 1; i++) {
        for (const auto& edge : edges) {
            int u = edge.src;
            int v = edge.dest;
            int weight = edge.weight;

            if (dist[u] != INF && dist[u] + weight < dist[v]) {
                dist[v] = dist[u] + weight;
            }
        }
    }

    // Check for negative weight cycles
    for (const auto& edge : edges) {
        int u = edge.src;
        int v = edge.dest;
        int weight = edge.weight;

        if (dist[u] != INF && dist[u] + weight < dist[v]) {
            return false; // Negative weight cycle found
        }
    }

    // Check whether all nodes have the same shortest distance
    for (int i = 1; i < numNodes; i++) {
        if (dist[i] != dist[0]) {
            return false; // Shortest distances are not the same
        }
    }

    return true; // All shortest distances are the same
}

int main() {
    // Example graph
    vector<Edge> edges = {
        {0, 1, 1},
        {0, 3, 2},
        {1, 2, 4},
        {2, 3, 5}
    };
    int numNodes = 4;

    if (isCostSame(edges, numNodes)) {
        cout << "The cost of going from any node to any other node via all possible paths is the same." << endl;
    } else {
        cout << "The cost of going from any node to any other node via all possible paths is not the same." << endl;
    }

    return 0;
}

Output

The cost of going from any node to any other node via all possible paths is not the same.

Conclusion

In conclusion, determining whether or not the cost of moving from one node to another via all possible paths is equal is a significant topic in graph analysis. The Floyd−Warshall and the Bellman−Ford are two effective solutions to this problem.The Floyd−Warshall technique may be used to find all of the shortest path costs between any two nodes in a graph. Because it functions with both directed and undirected graphs, it is a versatile option. The Bellman−Ford technique, in contrast, is designed to find single−source shortest routes and is capable of handling graphs with negative edge weights as well as spotting negative weight cycles.

Updated on: 13-Jul-2023

41 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements