added bellman-ford for c++ (#115)
parent
f7c33dcb6e
commit
929c1366a0
|
@ -3,5 +3,4 @@
|
||||||
### C or C++
|
### C or C++
|
||||||
|
|
||||||
1. [Kruskal Algorithm](c-or-cpp/kruskal-algorithm.cpp)
|
1. [Kruskal Algorithm](c-or-cpp/kruskal-algorithm.cpp)
|
||||||
|
2. [Bellman Ford Algorithm](c-or-cpp/bellman-ford.cpp)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,92 @@
|
||||||
|
//Bellman Ford Algorithm
|
||||||
|
#include<bits/stdc++.h>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
bool bellman_ford(vector<tuple<int,int,int>>graph,int V,int s,vector<int>&dist)
|
||||||
|
{
|
||||||
|
|
||||||
|
//no. of edges
|
||||||
|
int n = graph.size();
|
||||||
|
for(int i=0;i<V;i++)
|
||||||
|
{
|
||||||
|
dist.push_back(INT_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
dist[s] = 0;
|
||||||
|
|
||||||
|
//V-1 times relaxation of all edges is done
|
||||||
|
for(int i=0;i<V-1;i++)
|
||||||
|
{
|
||||||
|
for(int j=0;j<n;j++)
|
||||||
|
{
|
||||||
|
int src = get<0>(graph[j]);
|
||||||
|
int dest = get<1>(graph[j]);
|
||||||
|
int weight = get<2>(graph[j]);
|
||||||
|
|
||||||
|
if(dist[src]!=INT_MAX && dist[dest]>dist[src]+weight)
|
||||||
|
{
|
||||||
|
dist[dest] = dist[src]+weight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//The algorithm works fine with negative edges but does not work with negative weight cycles
|
||||||
|
//thus checking for any negative weight cycles...
|
||||||
|
|
||||||
|
for(int i=0;i<n;i++)
|
||||||
|
{
|
||||||
|
int src = get<0>(graph[i]);
|
||||||
|
int dest = get<1>(graph[i]);
|
||||||
|
int weight = get<2>(graph[i]);
|
||||||
|
|
||||||
|
if(dist[src]!=INT_MAX && dist[dest]>dist[src]+weight)
|
||||||
|
{
|
||||||
|
cout<<"Negative weight cycle detected..\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
//no. of vertices(V) & source(s)
|
||||||
|
int V = 6, s=0;
|
||||||
|
|
||||||
|
//graph containing all the weighted edges..
|
||||||
|
vector<tuple<int,int,int>>graph;
|
||||||
|
|
||||||
|
//inserting an edge with :
|
||||||
|
//src = 0
|
||||||
|
//dest = 1
|
||||||
|
// weight = 10
|
||||||
|
graph.push_back(make_tuple(0,1,10));
|
||||||
|
graph.push_back(make_tuple(0,2,8));
|
||||||
|
graph.push_back(make_tuple(1,4,2));
|
||||||
|
graph.push_back(make_tuple(2,3,1));
|
||||||
|
graph.push_back(make_tuple(3,1,-4));
|
||||||
|
graph.push_back(make_tuple(3,4,-1));
|
||||||
|
graph.push_back(make_tuple(4,5,-2));
|
||||||
|
graph.push_back(make_tuple(5,1,1));
|
||||||
|
|
||||||
|
//vector to store distances of all vertices from source(s)
|
||||||
|
vector<int>dist;
|
||||||
|
bool neg = bellman_ford(graph,V,s,dist);
|
||||||
|
|
||||||
|
//if no negative weigth cycle is found...
|
||||||
|
if(neg)
|
||||||
|
{
|
||||||
|
cout<<"vertex Dist from Source\n";
|
||||||
|
for(int i=0;i<dist.size();i++)
|
||||||
|
{
|
||||||
|
cout<<i<<"\t\t\t"<<dist[i]<<"\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue