Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Detect a negative cycle in a Graph using the Shortest Path Faster Algorithm
The Shortest Path Faster Algorithm is an improved or more optimized version of the Bellman-Ford Algorithm. It calculates the single source's shortest path in a weighted directed graph. This algorithm is especially suitable for graphs with negatively weighted edges.
Algorithm
Given a weighted directed graph and a source vertex , the algorithm finds the shortest path from , to each vertex , in the graph. The length of thh shortest path from to is stored in for each vertex .
procedure Shortest-Path-Faster-Algorithm(G, s)
for each vertex v ? s in V(G)
d(v) := ?
d(s) := 0
push s into Q
while Q is not empty do
u := poll Q
for each edge (u, v) in E(G) do
if d(u) + w(u, v) < d(v) then
d(v) := d(u) + w(u, v)
if v is not in Q then
push v into Q
Problem Statement
Given a graph G containing N nodes having values from 0 to N-1, a source S and an array A[][3] of the type {u, v, w} denoting a directed edge from u to v having weight w. The aim is to find if there exists a negative cycle in the graph from the given source.
Sample Example 1
Input: N = 3, S = 0, A[][] = {{0, 1, -2}, {1, 2, 1}, {2, 0, -1}}
Output: True
Explanation
Starting from 0, the graph contains the following cycle
0 -> 1 -> 2 -> 0
Sum of weights of the above cycle = (-2) + 1 + (-1) = (-2)
Thus, graph contains cycle of negative weight.
Sample Example 2
Input: N = 3, S = 0, A[][] = {{0, 1, -2}, {1, 2, 1}, {0, 2, -1}}
Output: False
Explanation
Starting from 0, the graph does not contain a cycle.
Solution Approach
Using SPFA to detect a negative weighted cycle in a graph, we follow the following steps
Create arrays distance[] with infinity value, visited[] with false and count[] with 0 which will contain the number of times a node has been relaxed.
Then traverse the graph using the SPFA algorithm.
Increment the count for each vertex upon relaxation i.e. updating the cost of each vertex connected to v if the cost improves by including v in the path.
Return true if some vertex is relaxed for the Nth time else returns false.
Example: C++ Implementation
The following code uses the SPFA algorithm to find the negative cycle in the graph.
#include <bits/stdc++.h>
using namespace std;
bool SFPA(int V, int S, int E[][3], int M){
// Adjacency list of the given graph
vector<pair<int, int>> g[V];
// Create Adjacency List
for (int i = 0; i < M; i++){
int u = E[i][0];
int v = E[i][1];
int w = E[i][2];
g[u].push_back({v, w});
}
vector<int> distance(V, INT_MAX);
vector<bool> visted(V, false);
vector<int> count(V, 0);
// Distance from src to src is 0
distance[S] = 0;
queue<int> q;
q.push(S);
// Mark source as visited
visted[S] = true;
while (!q.empty()) {
int u = q.front();
q.pop();
visted[u] = false;
// Relaxing all edges of vertex from the Queue
for (pair<int, int> x : g[u]) {
int v = x.first;
int cost = x.second;
// Update the distance[v] to minimum distance
if (distance[v] > distance[u] + cost) {
distance[v] = distance[u] + cost;
// If vertex v is in Queue
if (!visted[v]) {
q.push(v);
visted[v] = true;
count[v]++;
// Negative cycle
if (count[v] >= V)
return true;
}
}
}
}
// No cycle found
return false;
}
int main(){
int N = 4;
int S = 0;
int M = 4;
// Given Edges with weight
int E[][3] = {{0, 1, 1},
{1, 2, -1},
{2, 3, -1},
{3, 0, -1}};
// If cycle is present
if (SFPA(N, S, E, M) == true)
cout << "True" << endl;
else
cout << "False" << endl;
return 0;
}
Output
True
Conclusion
In conclusion, in order to detect negative cycle in a graph, Shortest Path Fast Algorithm can be used as it is most efficient when dealing with negative weights of edges. The above solution gives a time complexity of O(N*M) and a space complexity of O(N).