package DataStructures.Graphs;import java.util.*;class BellmanFord/*Implementation of Bellman ford to detect negative cycles. Graph accepts inputs in form of edges which havestart 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*/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 parentreturn;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 variablesobj.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 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[]=new Edge[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]=new Edge(u,ve,w);}int dist[]=new int[v];//Distance array for holding the finalized shortest path distance between source and all verticesint p[]=new int[v];//Parent array for holding the pathsfor(i=0;i<v;i++)dist[i]=Integer.MAX_VALUE;//Initializing distance valuesdist[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;//Updatep[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("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 verticesint p[]=new int[v];//Parent array for holding the pathsfor(i=0;i<v;i++)dist[i]=Integer.MAX_VALUE;//Initializing distance valuesdist[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;//Updatep[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*/public void addEdge(int x,int y,int z)//Adds unidirectionl Edge{edges[index++]=new Edge(x,y,z);}public Edge[] getEdgeArray(){return edges;}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。