Advertisement
kator

Dijkstra

Oct 2nd, 2014
401
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.57 KB | None | 0 0
  1. package grafy;
  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.util.*;
  5.      
  6. class Kr{
  7.     W w;
  8.     int i;
  9.     Kr(){
  10.        
  11.     }
  12.    
  13. }
  14. class CustomComparator implements Comparator<W> {
  15.     @Override
  16.     public int compare(W o1, W o2) {
  17.         return o1.getWaga(o1) - o2.getWaga(o2);
  18. //      return o1.getWaga(o1).compareTo(o2.getWaga(o2));
  19.     }
  20. }
  21. class W{
  22.         private int MAX = 1000;
  23.         private List<Kr> laczenia=new ArrayList<Kr>();
  24. //        private List<Integer> laczeniaW = new ArrayList<Integer>();
  25.         private int number, odleglosc, waga=0;
  26.         private String color;
  27.         private W poprzednik;
  28.         W(){
  29.         }
  30.        
  31.         void addConnection(Kr kr){
  32.                 laczenia.add(kr);
  33.         }
  34.        
  35.         void delDuplicates(W w){
  36.                 for(int i=0;i<w.laczenia.size();++i){
  37.                         for(int j=i+1;j<w.laczenia.size();){
  38.                                 if(w.laczenia.get(j).equals(w.laczenia.get(i)))w.laczenia.remove(j);
  39.                                 else ++j;
  40.                         }
  41.                 }
  42.         }
  43.        
  44.         int getOdleglosc(W w){
  45.             return w.odleglosc;
  46.         }
  47.        
  48.         W getPoprzednik(W w){
  49.             return w.poprzednik;
  50.         }
  51.        
  52.         int getWaga(W w){
  53.             return w.waga;
  54.         }
  55.        
  56.         int getNumber(W w){
  57.             return w.number;
  58.         }
  59.        
  60.         boolean isWhite(W w){
  61.             return (w.color.equalsIgnoreCase("bialy"))?true:false;
  62.     }
  63.        
  64.         void printConnections(List<W> graf){
  65.             for(W x: graf){
  66.                 System.out.print(x.number+": ");
  67.                 for(Kr kr: x.laczenia){
  68.                     System.out.print("("+kr.w.getNumber(kr.w)+","+kr.i+") ");
  69.                 }
  70.                 System.out.println();
  71.             }  
  72.         }
  73.        
  74.         void setNumber(int i){
  75.                 number = i;
  76.         }
  77.        
  78.         void setWhite(W w){
  79.                 w.color = "bialy";
  80.         }
  81.        
  82.         void setBlack(W w){
  83.                 w.color = "czarny";
  84.         }
  85.        
  86.         void setGray(W w){
  87.                 w.color = "szary";
  88.         }      
  89.        
  90.         void setPoprzednik(W w){
  91.             poprzednik = w;
  92.         }
  93.        
  94.         void setWaga(W w, int i){
  95.             w.waga=i;
  96.         }
  97.        
  98.         void zwiekszOdleglosc(W w){
  99.                 ++w.odleglosc;
  100.         }
  101.        
  102.         void BFS(List<W> graf, int s){
  103.                 List<W> list = new ArrayList<W>();
  104.                 for(int i=0;i<graf.size();++i){
  105.                         graf.get(i).setWhite(graf.get(i));
  106.                         graf.get(i).setPoprzednik(null);
  107.                         graf.get(i).setWaga(graf.get(i), MAX);
  108.                 }
  109.                 graf.get(s).setGray(graf.get(s));
  110.                 graf.get(s).setWaga(graf.get(s), 0);
  111.                 graf.get(s).setPoprzednik(null);
  112.                 list.add(graf.get(s));
  113.                 while(!list.isEmpty()){
  114.                         W u = list.get(0);
  115.                         list.remove(0);
  116. //                        for(int i=0;i<laczenia.size();++i)
  117.                         for(Kr v: u.laczenia)
  118.                         {
  119. //                          W v = laczenia.get(i).w;
  120. //                          int waga = laczenia.get(i).i;
  121.                                 if(v.w.isWhite(v.w)){
  122.                                         v.w.setGray(v.w);
  123.                                         v.w.zwiekszOdleglosc(v.w);
  124.                                         v.w.setWaga(v.w, v.i);
  125.                                         v.w.setPoprzednik(u);
  126.                                         list.add(v.w);
  127.                                 }
  128.                         }
  129.                         u.setBlack(graf.get(u.number));
  130.                 }
  131.         }
  132.        
  133.         void Dijkstra(List<W> graf, int s){
  134.             List<W> list = new ArrayList<W>();
  135.             for(int i=0;i<graf.size();++i){
  136.                 graf.get(i).setWhite(graf.get(i));
  137.                 graf.get(i).setPoprzednik(null);
  138.                 graf.get(i).setWaga(graf.get(i), MAX);
  139.             }
  140.             graf.get(s).setWaga(graf.get(s), 0);
  141.             graf.get(s).setPoprzednik(null);
  142.             list.add(graf.get(s));
  143.             while(!list.isEmpty()){
  144.                 Collections.sort(list, new CustomComparator());
  145.                 int i=0;
  146.                 while(list.get(i).color.compareTo("czarny")==0){
  147.                     list.remove(i);
  148.                 }
  149.                 graf.get(s).setBlack(graf.get(s));
  150.                 W u = list.get(i);// do edycji, musi brac element o najmniejszej wadze}
  151.                 list.remove(i);
  152.                 for(Kr kr: u.laczenia){
  153.                     if(kr.w.isWhite(kr.w)){
  154.                         if(kr.i+u.waga<kr.w.waga){
  155.                             kr.w.setWaga(kr.w, kr.i+u.waga);
  156.                             kr.w.zwiekszOdleglosc(kr.w);
  157.                         }
  158.                         kr.w.setPoprzednik(u);
  159.                         list.add(kr.w);
  160.                     }
  161.                 }
  162.                 graf.get(i).setBlack(graf.get(i));
  163.             }
  164.         }
  165. }
  166.      
  167. public class Bfs {
  168.         public static void main(String[] args) throws FileNotFoundException{
  169.                 Scanner sc = new Scanner(new File("H:\\java\\workspace\\klasa3\\src\\grafy\\Bfs.txt"));
  170.                 List<W> graf = new ArrayList<W>();
  171.                 W w; Kr kr;
  172.                 int n = sc.nextInt(), x = sc.nextInt();
  173.                 for(int i=0;i<n;++i){
  174.                         w = new W();
  175.                         w.setNumber(i);
  176.                         graf.add(w);
  177.                 }
  178.                 while(sc.hasNext()){
  179.                         int a = sc.nextInt(), b = sc.nextInt(), c = sc.nextInt();
  180.                         kr = new Kr();
  181.                         kr.w=graf.get(b);
  182.                         kr.i=c;
  183.                         graf.get(a).addConnection(kr);
  184.                 }
  185.                 sc.close();
  186.                 w = new W();
  187.                 w.printConnections(graf);
  188.                 w.Dijkstra(graf, x);
  189.                 for(int i=0;i<n;++i){
  190.                     System.out.print(x+" -> "+ graf.get(i).getNumber(graf.get(i)) +" waga "+graf.get(i).getWaga(graf.get(i))+" trasa: ");
  191.                     System.out.print(graf.get(i).getNumber(graf.get(i)));
  192.                     int j=graf.get(i).getNumber(graf.get(i));
  193.                     while(graf.get(j).getNumber(graf.get(j))!=x){
  194.                         j=graf.get(j).getNumber(graf.get(j).getPoprzednik(graf.get(j)));
  195.                         System.out.print("<-"+graf.get(j).getNumber(graf.get(j)));
  196.                     }
  197.                     System.out.println();
  198.                 }
  199.         }
  200. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement