packagecom.thealgorithms.datastructures.graphs;importjava.util.*;classBellmanFord/*Implementation of Bellman ford to detect negative cycles. Graph accepts inputs in form of edges which have
start vertex, end vertex and weights. Vertices should be labelled with a number between 0 and total number of vertices-1,both inclusive*/{int vertex, edge;privateEdge edges[];privateint index =0;BellmanFord(int v,int e){
vertex = v;
edge = e;
edges =newEdge[e];}classEdge{int u, v;int w;/**
* @param u Source Vertex
* @param v End vertex
* @param c Weight
*/publicEdge(int a,int b,int c){
u = a;
v = b;
w = c;}}/**
* @param p[] Parent array which shows updates in edges
* @param i Current vertex under consideration
*/voidprintPath(int p[],int i){if(p[i]==-1)// Found the path back to parent{return;}printPath(p, p[i]);System.out.print(i +" ");}publicstaticvoidmain(String args[]){BellmanFord obj =newBellmanFord(0,0);// Dummy object to call nonstatic variables
obj.go();}publicvoidgo()// Interactive run for understanding the class first time. Assumes source vertex is 0 and// shows distance to all vertices{Scanner sc =newScanner(System.in);// Grab scanner object for user inputint i, v, e, u, ve, w, j, neg =0;System.out.println("Enter no. of vertices and edges please");
v = sc.nextInt();
e = sc.nextInt();Edge arr[]=newEdge[e];// Array of edgesSystem.out.println("Input edges");for(i =0; i < e; i++){
u = sc.nextInt();
ve = sc.nextInt();
w = sc.nextInt();
arr[i]=newEdge(u, ve, w);}int dist[]=newint[v];// Distance array for holding the finalized shortest path distance between source// and all verticesint p[]=newint[v];// Parent array for holding the pathsfor(i =0; i < v; i++){
dist[i]=Integer.MAX_VALUE;// Initializing distance values}
dist[0]=0;
p[0]=-1;for(i =0; i < v -1; i++){for(j =0; j < e; j++){if((int) dist[arr[j].u]!=Integer.MAX_VALUE
&& dist[arr[j].v]> dist[arr[j].u]+ arr[j].w){
dist[arr[j].v]= dist[arr[j].u]+ arr[j].w;// Update
p[arr[j].v]= arr[j].u;}}}// Final cycle for negative checkingfor(j =0; j < e; j++){if((int) dist[arr[j].u]!=Integer.MAX_VALUE && dist[arr[j].v]> dist[arr[j].u]+ arr[j].w){
neg =1;System.out.println("Negative cycle");break;}}if(neg ==0)// Go ahead and show results of computation{System.out.println("Distances are: ");for(i =0; i < v; i++){System.out.println(i +" "+ dist[i]);}System.out.println("Path followed:");for(i =0; i < v; i++){System.out.print("0 ");printPath(p, i);System.out.println();}}
sc.close();}/**
* @param source Starting vertex
* @param end Ending vertex
* @param Edge Array of edges
*/publicvoidshow(int source,int end,Edge arr[])// Just shows results of computation, if graph is passed to it. The graph should// be created by using addEdge() method and passed by calling getEdgeArray() method{int i, j, v = vertex, e = edge, neg =0;double dist[]=newdouble[v];// Distance array for holding the finalized shortest path distance between source// and all verticesint p[]=newint[v];// Parent array for holding the pathsfor(i =0; i < v; i++){
dist[i]=Integer.MAX_VALUE;// Initializing distance values}
dist[source]=0;
p[source]=-1;for(i =0; i < v -1; i++){for(j =0; j < e; j++){if((int) dist[arr[j].u]!=Integer.MAX_VALUE
&& dist[arr[j].v]> dist[arr[j].u]+ arr[j].w){
dist[arr[j].v]= dist[arr[j].u]+ arr[j].w;// Update
p[arr[j].v]= arr[j].u;}}}// Final cycle for negative checkingfor(j =0; j < e; j++){if((int) dist[arr[j].u]!=Integer.MAX_VALUE && dist[arr[j].v]> dist[arr[j].u]+ arr[j].w){
neg =1;System.out.println("Negative cycle");break;}}if(neg ==0)// Go ahead and show results of computaion{System.out.println("Distance is: "+ dist[end]);System.out.println("Path followed:");System.out.print(source +" ");printPath(p, end);System.out.println();}}/**
* @param x Source Vertex
* @param y End vertex
* @param z Weight
*/publicvoidaddEdge(int x,int y,int z)// Adds unidirectional edge{
edges[index++]=newEdge(x, y, z);}publicEdge[]getEdgeArray(){return edges;}}