Start Typing !!! type the highlighted character. You can't scroll once you start typing.
filename

BellmanFord.java

package DataStructures.Graphs;

import java.util.*;

class BellmanFord

/*Implementation of Bellman ford to detect negative cycles. Graph accepts inputs in form of edges which have

start vertex, end vertes and weights. Vertices should be labelled with a number between 0 and total number of vertices-1,both inclusive*/

{

int vertex,edge;

private Edge edges[];

private int index=0;

BellmanFord(int v,int e)

{

vertex=v;

edge=e;

edges=new Edge[e];

}

class Edge

{

int u,v;

int w;

/**

*@param u Source Vertex

* @param v End vertex

* @param c Weight

*/

public Edge(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

*/

void printPath(int p[],int i)

{

if(p[i]==-1)//Found the path back to parent

return;

printPath(p,p[i]);

System.out.print(i+" ");

}

public static void main(String args[])

{

BellmanFord obj=new BellmanFord(0,0);//Dummy object to call nonstatic variables

obj.go();

}

public void go()//Interactive run for understanding the class first time. Assumes source vertex is 0 and shows distaance to all vertices

{

Scanner sc=new Scanner(System.in);//Grab scanner object for user input

int 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[]=new Edge[e];//Array of edges

System.out.println("Input edges");

for(i=0;i<e;i++)

{

u=sc.nextInt();

ve=sc.nextInt();

w=sc.nextInt();

arr[i]=new Edge(u,ve,w);

}

int dist[]=new int[v];//Distance array for holding the finalized shortest path distance between source and all vertices

int p[]=new int[v];//Parent array for holding the paths

for(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 checking

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)

{

neg=1;

System.out.println("Negative cycle");

break;

}

if(neg==0)//Go ahead and show results of computaion

{

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

*/

public void show(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[]=new double[v];//Distance array for holding the finalized shortest path distance between source and all vertices

int p[]=new int[v];//Parent array for holding the paths

for(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 checking

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)

{

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

*/

public void addEdge(int x,int y,int z)//Adds unidirectionl Edge

{

edges[index++]=new Edge(x,y,z);

}

public Edge[] getEdgeArray()

{

return edges;

}