package Ford_max_min; import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * * @author Dan * Class that implements 2 algorithm Route Minim..Route Maxim */ public class Ford { Scanner in = new Scanner(System.in); int numberOfNodes = 0; int [] H; List<Arc> tree; List<Arc> finalTree = new ArrayList<Arc>(); public Ford() { int choose=-1; menu(); choose=in.nextInt(); switch(choose) { case 1: { enterList(); afisArcs(); ford_min(); solvef(); break; } case 2: { enterList(); afisArcs(); ford_max(); solvef(); break; } case 0: { break; } } } /** * Print the result recursive */ public void solvef() { for(int i=finalTree.size()-1;i>=0;i--) { if(finalTree.get(i).getNodeFinish()==numberOfNodes) { recursAfis(finalTree.get(i)); System.out.println(); } } } /** * Algorthm form minim */ public void ford_min() { int tmpRes = 0; boolean flag = false; initHmin(); do { for(int i=0;i<tree.size();i++) { tmpRes = H[tree.get(i).getNodeFinish()]-H[tree.get(i).getNodeStart()]; if(tmpRes > tree.get(i).getArcLength()) { tree.get(i).setIsBig(true); tree.get(i).setIsEqual(false); tree.get(i).setIsSmall(false); H[tree.get(i).getNodeFinish()]=tree.get(i).getArcLength() + H[tree.get(i).getNodeStart()]; } if(tmpRes == tree.get(i).getArcLength()) { tree.get(i).setIsEqual(true); tree.get(i).setIsSmall(false); tree.get(i).setIsBig(false); } if(tmpRes < tree.get(i).getArcLength()) { tree.get(i).setIsSmall(true); tree.get(i).setIsEqual(false); tree.get(i).setIsBig(false); } } flag=checkMin(); }while(flag!=true); copyNodes(); } /** * Algorithm ford maxim */ public void ford_max() { int tmpRes = 0; boolean flag = false; initHmax(); do { for(int i=0;i<tree.size();i++) { tmpRes = H[tree.get(i).getNodeFinish()]-H[tree.get(i).getNodeStart()]; if(tmpRes > tree.get(i).getArcLength()) { tree.get(i).setIsBig(true); tree.get(i).setIsEqual(false); tree.get(i).setIsSmall(false); } if(tmpRes == tree.get(i).getArcLength()) { tree.get(i).setIsEqual(true); tree.get(i).setIsSmall(false); tree.get(i).setIsBig(false); } if(tmpRes < tree.get(i).getArcLength()) { tree.get(i).setIsSmall(true); tree.get(i).setIsEqual(false); tree.get(i).setIsBig(false); H[tree.get(i).getNodeFinish()]=tree.get(i).getArcLength() + H[tree.get(i).getNodeStart()]; } } flag=checkMax(); }while(flag!=true); copyNodes(); } /** * Method that check if node determined is Higher than Cij * @return */ public boolean checkMin() { boolean tmp; tmp = true; for(int i = 0 ;i<tree.size();i++) { if(tree.get(i).getIsBig() == true) { tmp = false; break; } } return tmp; } /** * Method that check if node determined is Higher than Cij * @return */ public boolean checkMax() { boolean tmp; tmp = true; for(int i = 0 ;i<tree.size();i++) { if(tree.get(i).getIsSmall() == true) { tmp = false; break; } } return tmp; } /** * Initialize List of Nodes */ public void enterList() { System.out.println("How many Nodes do You Have? :"); numberOfNodes = in.nextInt(); H = new int[numberOfNodes+1]; tree = new ArrayList<Arc>(); System.out.println("Enter from what node to what node point and length (1 2 8) and 0 for next node else 1 to finish"); int check = 0; while(check!=1) { label : { int start = in.nextInt(); int finish = in.nextInt(); int length = in.nextInt(); while(length == 0) { System.out.println("lenght = 0"); length = in.nextInt(); } Arc tmp = new Arc(); tmp.setNodeStart(start); tmp.setNodeFinish(finish); tmp.setArcLength(length); for(int i = 0;i<tree.size();i++) { if(tmp.equalsArc(tree.get(0))) { break label; } } tree.add(tmp); check = in.nextInt(); } } } /** * Initialize array H with +inf */ public void initHmin() { H[1]=0; for(int i=2;i<H.length;i++) { H[i]=99999999; //inf } } /** * Initialize array H with -inf */ public void initHmax() { H[1]=0; for(int i=2;i<H.length;i++) { H[i]=-99999999; //inf } } /** * Print primitive Nodes */ public void afisArcs() { System.out.println("Nodes are :"); for(int i=0;i<tree.size();i++) { System.out.println("Node"+(i+1)+": "+tree.get(i).getNodeStart()+","+tree.get(i).getNodeFinish()+"="+tree.get(i).getArcLength()); } } /** * Nodes */ public void copyNodes() { for(int i=0;i<tree.size();i++) { if(tree.get(i).getIsEqual()==true) { finalTree.add(tree.get(i)); } } } /** * Recursive print solution * @param e */ public void recursAfis(Arc e) { int x = 1; if(e.getNodeStart()==x) { System.out.print(e.getNodeStart()); } else { for(int i=0;i<finalTree.size();i++) { if(e.getNodeStart()==finalTree.get(i).getNodeFinish()) { recursAfis(finalTree.get(i)); } } } System.out.print("-"+e.getNodeFinish()); } /** * Menu for user */ public void menu() { System.out.printf("Author: Cebotarenco Dan\n\n"); System.out.printf("Choose an algorithm of Minim or Maxim Route:\n"); System.out. printf(" \n 1 - Ford Minim \n 2 - Ford Maxim \n"); } }