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*/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 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 voidgo() // 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;}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。