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