Advertisement
Guest User

Untitled

a guest
Jan 20th, 2018
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.49 KB | None | 0 0
  1. package zadanie;
  2.  
  3. import java.io.IOException;
  4. import java.nio.file.Paths;
  5. import java.util.Scanner;
  6.  
  7. public class Main {
  8.  
  9.     // tablica przechowujaca nazwy miast
  10.     private static String[] cities;
  11.  
  12.     // tablica przechowująca odległości do miast
  13.     private static double[][] weights;
  14.     private static double[][] points;
  15.  
  16.     // tablica przechowujaca informacje o tym czy miasto zostalo juz odwiedzone
  17.     private static boolean[] visited;
  18.  
  19.     // przechowuje liczbe miast
  20.     private static int citiesCount;
  21.  
  22.  
  23.  
  24.     // wypisuje miasto w postaci tabeli
  25.     private static void printCitiesTable() {
  26.  
  27.         // wypisanie nowej linii i zrobienie odstepu na 10 znakow od lewej strony
  28.         System.out.printf("\n");
  29.         System.out.printf("%10s", " ");
  30.  
  31.         // wypisanie miast w kolumnach o szerokosci 10 znakow
  32.         for(int j = 0; j < citiesCount; j++) {
  33.             System.out.printf("%10s", cities[j]);
  34.         }
  35.         System.out.println("");
  36.  
  37.         // wypisanie miasta i odleglosci z niego do kazdego innego miasta
  38.         for(int i = 0; i < citiesCount; i++) {
  39.             System.out.printf("%10s", cities[i]);
  40.             for(int j = 0; j < citiesCount; j++) {
  41.                 System.out.printf("%10.2f", weights[i][j]);
  42.             }
  43.             System.out.println("");
  44.         }
  45.     }
  46.  
  47.     // znajduje najkrotsza sciezke
  48.     // zaczynajac od miasta podanego w parametrze from
  49.     private static int getDistance(int from) {
  50.         int beginning = from; // usaw poczatek na from
  51.         int distance = 0;     // na start odleglosc 0
  52.  
  53.         // zacznamy z pewnego punktu wiec ten punkt startowy jest juz odiwedzony
  54.         visited[from] = true; // Ustaw wybrany wierzchołek jako aktualny, oznacz go jako odwiedzony.
  55.  
  56.  
  57.  
  58.         System.out.print("\n\n"+cities[from]);
  59.  
  60.         // Znajdź ten spośród nieodwiedzonych wierzchołków, który jest połączony z aktualnym krawędzią o najmniejszej wadze.
  61.  
  62.         // ustaw nowy wierzcholem, jezeli zaczynamy z 0 to na 1, jezeli nie to na 0
  63.         // dzieki temu program sie nie zapętli
  64.         int newNode = (from == 0) ? 1 : 0;
  65.  
  66.         // pętla wyszukujacy najkrotsza trase z podanego punktu
  67.         do {
  68.  
  69.             // dla wszystkich miast
  70.             for (int i = 0; i < citiesCount; i++) {
  71.                 // jezeli bylo odwiedzone lub to jest miasto
  72.                 // z ktorego zaczynamy to je po pomin i przejdz
  73.                 // do kolejnej iteracji petli
  74.                 if (i == from || visited[i]) {
  75.                     continue;
  76.                 }
  77.  
  78.                 // jezeli odleglosc z miasta aktualnie ogladanego
  79.                 // jest mniejsza niz z miasta, ktore wybrano
  80.                 // jako kolejny punkt trasy
  81.                 // to znaczy, ze znaleziono nowe miasto
  82.                 // ktore powinno odwiedzic sie jako nastepne
  83.                 if (weights[from][i] <= weights[from][newNode]) {
  84.                     // ustaw nowe miasto jako to przed chwila znalezione
  85.                     newNode = i;
  86.                 }
  87.             }
  88.  
  89.             // zsumuj odleglosc do kolejnego miasta
  90.             distance += weights[from][newNode];
  91.  
  92.             // teraz from to miasto przed chwila znalezione
  93.             // poniewaz od niego teraz bedzie wyszukiwane kolejne najblizsze
  94.             from = newNode;
  95.  
  96.             // ustaw miasto jako odwiedzone
  97.             visited[from] = true;
  98.  
  99.             // wypisz strzalke i nazwe kolejnego miasta
  100.             System.out.print(" -> " + cities[from]);
  101.  
  102.             // sprawdz we wszystkich miastach
  103.             for(int j = 0; j < citiesCount; j++) {
  104.                 // jezeli nie jest bylo odwiedzone
  105.                 if(!visited[j]) {
  106.                     // ustaw nowe jako numer tego nie odwiedzonego
  107.                     newNode = j;
  108.                 }
  109.             }
  110.         } while(visitedCount() != citiesCount); // powtarzaj petle dopoki wszystkie miasta nie zostana odwiedzone
  111.  
  112.         // wypisz strzalke i nazwe miasta poczatkowego zeby zamknac trase
  113.         System.out.print(" -> " + cities[beginning]);
  114.  
  115.         // dodaj odleglosc z ostatniego miasta do pierwszego zeby zamknac trase
  116.         distance += weights[from][beginning];
  117.        
  118.         // wypisz dlugosc trasy
  119.         System.out.println("\nDystans " + distance + "km");
  120.  
  121.  
  122.         // wyzeruj odwiedzenia miast
  123.         for(int i = 0; i < citiesCount; i++) {
  124.             visited[i] = false;
  125.         }
  126.         return distance;
  127.     }
  128.  
  129.     // zwraca liczbe miast ktore zostaly juz odwiedzone
  130.     public static int visitedCount() {
  131.         int sum = 0;
  132.  
  133.         // przejdz przez tablice odwiedzeń miast
  134.         for(boolean v : visited) {
  135.             if(v) { // jezeli odwiedzone to zwieksz licznik odwiedzonych miast o jeden
  136.                 sum++;
  137.             }
  138.         }
  139.  
  140.         // zwroc liczbe odiwedzonych miast
  141.         return sum;
  142.     }
  143.  
  144.  
  145.     // znajduje najkrotsza sciezke miedzy miastami
  146.     public static int getShortestPath() {
  147.         // na start dystanc na wartosc maksymalna, bedzie wyszukiwane
  148.         // cokolwiek co jest mniejsze od tej wartosci i zapisywane w tej zmiennej
  149.         // wiec w ostatecznosci tutaj bedzie najmniejsza odleglosc
  150.         int distance = Integer.MAX_VALUE;
  151.  
  152.         // numer miasta do ktorego aktualnia byla najkrotsza sciezka
  153.         int shortest = 0;
  154.  
  155.         // zmienna tymczasowa na przechowanie odleglosci
  156.         int temp = 0;
  157.  
  158.         // przejdz przez wszystkie miasta
  159.         for(int i = 0; i < citiesCount; i++) {
  160.  
  161.             // znajdz najkrotszy dystans z miasta o numerze i
  162.             temp = getDistance(i);
  163.  
  164.             // jezeli temp jest mniejsze od wartosci w distance
  165.             // to znaleziono nowa najkrotsza odleglosc
  166.             if(temp < distance) {
  167.                 distance = temp; // zapisz najkrotsza odleglosc
  168.                 shortest = i;   // zapisz numer miasta z ktorego zaczac
  169.                                 // zeby otrzymac najkrtosza sciezke
  170.             }
  171.         }
  172.  
  173.         System.out.println("\n\nNajkrótsza ścieżka: ");
  174.         return getDistance(shortest);
  175.     }
  176.  
  177.     // wczytuje miasta zapisane w postaci tabeli z kilometrami
  178.     // aktualnie ta funkcja nie jest uzywana, bo miasta mialy byc
  179.     // zapisane w postaci wspolrzednych 2d
  180.     public static void readFile(String name) throws IOException {
  181.         Scanner fileReader = new Scanner(Paths.get(name), "UTF-8");
  182.  
  183.         // wczytuje liczbe miast
  184.         citiesCount = fileReader.nextInt();
  185.  
  186.         System.out.println("Liczba miast: " + citiesCount);
  187.  
  188.         // rezerwuje tablice
  189.         cities = new String[citiesCount];
  190.         visited = new boolean[citiesCount];
  191.         weights = new double [citiesCount][citiesCount];
  192.  
  193.         // wczytuje nazwy miast
  194.         for(int i = 0; i < citiesCount; i++) {
  195.             cities[i] = fileReader.next();
  196.             System.out.println("Dodaje miasto: " + cities[i]);
  197.         }
  198.  
  199.         // wczytuje kilometry z kadzego miasta do kazdego
  200.         for(int i = 0; i < citiesCount; i++) {
  201.             for(int j = 0; j < citiesCount; j++) {
  202.                 weights[i][j] = fileReader.nextInt();
  203.             }
  204.         }
  205.     }
  206.  
  207.     // wczytuje miasta zapisane w postaci wspolrzednych 2d
  208.     public static void readFile2(String name) throws IOException {
  209.         Scanner fileReader = new Scanner(Paths.get(name), "UTF-8");
  210.  
  211.         // wczytaj ilosc miast
  212.         citiesCount = fileReader.nextInt();
  213.  
  214.         // wypisuje ilosc nazw
  215.         System.out.println("Liczba miast: " + citiesCount);
  216.  
  217.         // rezerwuje tablice na podstawie liczby miast
  218.         cities = new String[citiesCount];
  219.         visited = new boolean[citiesCount];
  220.         weights = new double[citiesCount][citiesCount];
  221.  
  222.         // wczytuje nazwy miast
  223.         for(int i = 0; i < citiesCount; i++) {
  224.             cities[i] = fileReader.next();
  225.             System.out.println("Dodaje miasto: " + cities[i]);
  226.         }
  227.  
  228.         // rezerwuje tablice na wspolrzedne dla kazdego miasta
  229.         points = new double[citiesCount][2];
  230.  
  231.         // wczytuje wspolrzedne dla kazdego miasta
  232.         for(int i = 0; i < citiesCount; i++) {
  233.             points[i][0] = fileReader.nextDouble();
  234.             points[i][1] = fileReader.nextDouble();
  235.  
  236.             // wypisuje informacje o wczytanych wspolrzednych
  237.             System.out.println("Dodano współrzędne: : " + cities[i] + " " + points[i][0] + ", " + points[i][1]);
  238.         }
  239.  
  240.         // oblicza odleglosc z kazdego miasta do kazdego
  241.         for(int i = 0; i < citiesCount; i++) {
  242.             for(int j = 0; j < citiesCount; j++) {
  243.                 weights[i][j] = calculateDistance(points[i][0], points[i][1], points[j][0], points[j][1]);
  244.                 //System.out.printf("%7.2f", weights[i][j]);
  245.             }
  246.             //System.out.println("");
  247.         }
  248.  
  249.     }
  250.  
  251.  
  252.     // liczy odleglosc miedzy dwoma punktami w ukladzie 2D
  253.     public static double calculateDistance(double x1, double y1, double x2, double y2) {
  254.         return Math.sqrt(Math.pow(x1-x2, 2) + Math.pow(y1-y2, 2));
  255.     }
  256.  
  257.     public static void main(String[] args) {
  258.         try {
  259.  
  260.             // wczytuje miasta z pliku
  261.             readFile2("miasta2.txt");
  262.             //readFile("miasta.txt");
  263.            
  264.             // wypisuje tabele odleglosci do miast
  265.             printCitiesTable();
  266.            
  267.             // znajduje najkrotsza sciezke miedzy miastami
  268.             getShortestPath();
  269.         } catch (IOException e) {
  270.             e.printStackTrace();
  271.         }
  272.        
  273.     }
  274. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement