Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. import java.util.LinkedList;
  2.  
  3.  
  4. public class Graph {
  5.     private double[][] path;
  6.     private double[] weight;
  7.    
  8.     private int []parent;
  9.    
  10.     public Graph(double [][]path){
  11.         this.path=path;
  12.     }
  13.     public Graph(int numberOfNode,double maximumDistance){
  14.         this.path=new double[numberOfNode][numberOfNode];
  15.         for(int i=0;i<path.length-1;i++){
  16.             path[i][i]=0;
  17.             for(int j=i+1;j<path[i].length;j++){
  18.                 path[i][j]=Math.random()*maximumDistance;
  19.                 path[j][i]=path[i][j];
  20.             }
  21.         }
  22.     }
  23.     public double getShortestDistanceTo(int goal){
  24.         if(weight!=null){
  25.             return weight[goal];
  26.         }
  27.        
  28.         return 0;
  29.     }
  30.     public Object []getPathTo(int goal){
  31.         if(weight!=null){
  32.             int root=goal;
  33.             LinkedList <Integer>list=new LinkedList<Integer>();
  34.             while(parent[root]!=root){
  35.                 list.add(0,root);
  36.                 root=parent[root];
  37.             }
  38.             list.add(0,root);
  39.             return list.toArray();
  40.         }
  41.        
  42.         return null;
  43.     }
  44.     public void setDistanceLimit(double limit){
  45.         for(int i=0;i<path.length-1;i++){
  46.             for(int j=i+1;j<path[i].length;j++){
  47.                 if(path[i][j]>limit){
  48.                     path[i][j]=Double.POSITIVE_INFINITY;
  49.                     path[j][i]=path[i][j];
  50.                 }
  51.             }
  52.         }
  53.     }
  54.  
  55.     public void shortestPath(int start){
  56.         weight=new double[path.length];
  57.         boolean []found=new boolean[path.length];
  58.        
  59.         parent=new int[path.length];
  60.        
  61.         for(int i=0;i<path.length;i++){
  62.             weight[i]=path[start][i];
  63.             found[i]=false;
  64.             parent[i]=start;
  65.         }
  66.  
  67.         weight[start]=0;
  68.         found[start]=true;
  69.  
  70.         for(int i=0;i<path.length;i++){
  71.  
  72.             int minId=0;
  73.             double minValue=Double.MAX_VALUE;
  74.             for(int j=0;j<path.length;j++){
  75.                 if(!found[j])
  76.                     if(minValue>weight[j]){
  77.                         minValue=weight[j];
  78.                         minId=j;
  79.                     }
  80.             }
  81.  
  82.             found[minId]=true;
  83.             for(int j=0;j<path.length;j++){
  84.                 if(!found[j])
  85.                     if(weight[j]>minValue+path[minId][j]){
  86.                         weight[j]=minValue+path[minId][j];
  87.                         parent[j]=minId;
  88.                     }
  89.             }
  90.         }
  91.  
  92.     }
  93.  
  94.    
  95.     public static void main(String []args){
  96.         double [][]path={{0,10,20},{20,0,7},{8,9,0}};
  97.         Graph g=new Graph(path);
  98.         g.setDistanceLimit(15);
  99.        
  100.         int start=0;
  101.         int goal=path.length-1;
  102.         g.shortestPath(start);
  103.         System.out.printf("The shortest distance between %d to %d is %.2f\n",start,goal,g.getShortestDistanceTo(goal));
  104.        
  105.         Object []pathList=g.getPathTo(goal);
  106.         System.out.printf("Path from %d to %d is ",start,goal);
  107.         for(int i=0;i<pathList.length;i++)
  108.             System.out.printf("-> %s ",pathList[i].toString());
  109.     }
  110. }