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;⏎
}⏎
⏎