Advertisement
Guest User

Untitled

a guest
Oct 27th, 2016
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.49 KB | None | 0 0
  1. package com.gboz.javaworkout;
  2.  
  3. import java.io.File;
  4. import java.io.FileNotFoundException;
  5. import java.util.*;
  6.  
  7. /**
  8. * Created by Grzegorz on 26.10.2016.
  9. */
  10.  
  11. /**
  12. * Krawedz grafu skierowanego. Zawiera informacje od ktorej do ktorej krawedzi
  13. * jest poprowadzona krawedz oraz zawiera jej wage(np. dlugosc, czas itd).
  14. *
  15. * @author mephisto
  16. */
  17. class DirectedEdge {
  18. // wierzcholek zrodlowy
  19. private final int from;
  20. // wierzcholek docelowy
  21. private final int to;
  22. // waga
  23. private final long weight;
  24.  
  25. public DirectedEdge(int from, int to, int weight) {
  26. this.from = from;
  27. this.to = to;
  28. this.weight = weight;
  29. }
  30.  
  31. public int from() {
  32. return from;
  33. }
  34.  
  35. public int to() {
  36. return to;
  37. }
  38.  
  39. public long getWeight() {
  40. return weight;
  41. }
  42.  
  43. @Override
  44. public String toString() {
  45. return String.format("%d->%d (%d) ", from, to, weight);
  46. }
  47. }
  48.  
  49. /**
  50. * Graf skierowany reprezentowany za pomoca list sasiedztwa danych wierzcholkow
  51. * skierowanych.
  52. *
  53. * @author mephisto
  54. */
  55. class DirectedGraph {
  56. // liczba wierzcholkow
  57. private final int v;
  58. // liczba krawedzi
  59. private int e;
  60. // listy sasiedztwa
  61. private List<DirectedEdge>[] neighborhoodLists;
  62.  
  63. @SuppressWarnings("unchecked")
  64. public DirectedGraph(int v) {
  65. this.v = v;
  66. this.e = 0;
  67. this.neighborhoodLists = (List<DirectedEdge>[]) new List[v];
  68. for (int i = 0; i < v; i++) {
  69. neighborhoodLists[i] = new ArrayList<DirectedEdge>();
  70. }
  71. }
  72.  
  73. public int getNumberOfEdges() {
  74. return e;
  75. }
  76.  
  77. public int getNumberOfVertices() {
  78. return v;
  79. }
  80.  
  81. /**
  82. * Dodaje krawedz skierowana do odpowiedniej listy sasiedztwa, listy
  83. * wierzcholka, z ktorej zaczyna sie krawedz.
  84. *
  85. * @param edge
  86. * krawedz, ktora ma zostac dodana do grafu
  87. */
  88. public void addEdge(DirectedEdge edge) {
  89. neighborhoodLists[edge.from()].add(edge);
  90. e++;
  91. }
  92.  
  93. /**
  94. * Zwraca liste sasiedztwa danego wierzcholka.
  95. *
  96. * @param v
  97. * indeks wierzcholka skierowanego
  98. * @return zwraca iterowalna kolekcje krawedzi skierowanych
  99. */
  100. public Iterable<DirectedEdge> getNeighborhoodList(int v) {
  101. return neighborhoodLists[v];
  102. }
  103. }
  104.  
  105. public class LoadDataFromFile {
  106.  
  107. class DistanceToEdge implements Comparable<DistanceToEdge> {
  108. // krawedz
  109. private final int edge;
  110. // odleglosc do tej krawedzi
  111. private long distance;
  112.  
  113. public DistanceToEdge(int edge, long distance) {
  114. this.edge = edge;
  115. this.distance = distance;
  116. }
  117.  
  118. public long getDistance() {
  119. return distance;
  120. }
  121.  
  122. public void setDistance(long distance) {
  123. this.distance = distance;
  124. }
  125.  
  126. public int getEdge() {
  127. return edge;
  128. }
  129.  
  130. @Override
  131. public int hashCode() {
  132. final int prime = 31;
  133. int result = 1;
  134. result = prime * result + getOuterType().hashCode();
  135. result = prime * result + (int) (distance ^ (distance >>> 32));
  136. result = prime * result + edge;
  137. return result;
  138. }
  139.  
  140. @Override
  141. public boolean equals(Object obj) {
  142. if (this == obj)
  143. return true;
  144. if (obj == null)
  145. return false;
  146. if (getClass() != obj.getClass())
  147. return false;
  148. DistanceToEdge other = (DistanceToEdge) obj;
  149. if (!getOuterType().equals(other.getOuterType()))
  150. return false;
  151. if (distance != other.distance)
  152. return false;
  153. if (edge != other.edge)
  154. return false;
  155. return true;
  156. }
  157.  
  158. @Override
  159. public int compareTo(DistanceToEdge param) {
  160. int cmp = new Long(distance).compareTo(param.getDistance());
  161.  
  162. if (cmp == 0) {
  163. return new Integer(edge).compareTo(param.getEdge());
  164. }
  165. return 0;
  166. }
  167.  
  168. private LoadDataFromFile getOuterType() {
  169. return LoadDataFromFile.this;
  170. }
  171. }
  172.  
  173. // ////////////////////////////////////////////////////////////////////
  174. // przechowuje krawedz z ktorej jest najblizej do biezacej okreslonej
  175. // indeksem tablicy
  176. private DirectedEdge[] edgeTo;
  177. // przechowuje najkrotsze znalezione odleglosci do danego wierzcholka
  178. private Long[] distanceTo;
  179. // kolejka przechowujaca biezace krawedzie uszeregowane od najkrotszej do
  180. // najdluzszej
  181. private Queue<DistanceToEdge> priorityQueue;
  182.  
  183. public LoadDataFromFile(DirectedGraph graph, int source) {
  184. // inicjacja wewnetrznych struktur
  185. edgeTo = new DirectedEdge[graph.getNumberOfVertices()];
  186. distanceTo = new Long[graph.getNumberOfVertices()];
  187. priorityQueue = new PriorityQueue<DistanceToEdge>(
  188. graph.getNumberOfVertices());
  189.  
  190. // dla kazdego wierzcholka v ustawiamy najwieksza mozliwa wartosc jaka
  191. // moze przechowywac
  192. for (int v = 0; v < graph.getNumberOfVertices(); v++) {
  193. distanceTo[v] = Long.MAX_VALUE;
  194. }
  195. // odleglosc do wierzcholka zrodlowego to 0
  196. distanceTo[source] = 0L;
  197.  
  198. // wstawiamy wierzholek zrodlowy do kolejki, od niego rozpoczynamy
  199. // poszukiwania
  200. priorityQueue.offer(new DistanceToEdge(source, 0L));
  201.  
  202. // przeprowadzamy relaksacje grafu dopoki kolejka nie jest pusta
  203. while (!priorityQueue.isEmpty()) {
  204. relax(graph, priorityQueue.poll().getEdge());
  205. }
  206.  
  207. }
  208.  
  209. private void relax(DirectedGraph graph, int v) {
  210. // przegladamy listy sasiedztwa wszystkich wierzcholkow
  211. for (DirectedEdge edge : graph.getNeighborhoodList(v)) {
  212. int w = edge.to();
  213.  
  214. // sprawdzamy czy zmiana wierzcholka skroci dystans z wierzcholka
  215. // zrodlowego
  216. if (distanceTo[w] > distanceTo[v] + edge.getWeight()) {
  217. distanceTo[w] = distanceTo[v] + edge.getWeight();
  218. edgeTo[w] = edge;
  219. DistanceToEdge dte = new DistanceToEdge(w, distanceTo[w]);
  220.  
  221. // jesli jest juz krawedz o tej wadze to ja usuwamy, bo
  222. // znalezlismy lepsza droge
  223. priorityQueue.remove(dte);
  224. // wstawiamy nowa krawedz z aktualna znaleziona odlegloscia
  225. priorityQueue.offer(dte);
  226. }
  227. }
  228.  
  229. }
  230.  
  231. // jesli zwrocona wartosc wynosi Long.MAX_VALUE to oznacza, ze dany
  232. // wierzcholek jest nieosiagalny ze zrodla
  233. public long getDistanceTo(int v) {
  234. return distanceTo[v];
  235. }
  236.  
  237. // jesli istnieje droga do danego wierzcholka jest mniejsza od
  238. // Long.MAX_VALUE, ktore zostalo inicjalnie ustawione dla wszystkich
  239. // wierzcholkow
  240. public boolean hasPathTo(int v) {
  241. return distanceTo[v] < Long.MAX_VALUE;
  242. }
  243.  
  244. // jesli nie istnieje sciezka do danego wierzcholka zostanie zwrocona pusta
  245. // kolekcja
  246. public Iterable<DirectedEdge> getPathTo(int v) {
  247. Deque<DirectedEdge> path = new ArrayDeque<DirectedEdge>();
  248. // jesli nie istnieje sciezka zwroc pusta sciezke
  249. if (!hasPathTo(v)) {
  250. return path;
  251. }
  252. // dopoki istnieje krawedz dodawaj ja do stosu
  253. // krawedz zrodlowa jest oznaczona jako null
  254. for (DirectedEdge e = edgeTo[v]; e != null; e = edgeTo[e.from()]) {
  255. path.push(e);
  256. }
  257. return path;
  258. }
  259.  
  260. public static void main(String[] args) throws FileNotFoundException {
  261. Scanner scanner = new Scanner(new File("ścieżka"));
  262. StringTokenizer stringTokenizer = new StringTokenizer(scanner.nextLine(), " ");
  263. ArrayList<Integer> integers = new ArrayList<>();
  264. Integer x;
  265. int count = 0;
  266. while (scanner.hasNextLine()) {
  267. count++;
  268. scanner.nextLine();
  269. }
  270. System.out.println(count);
  271. scanner = new Scanner(new File("ścieżka"));
  272. try {
  273. for (int i = 0; i <= count + 1; i++){
  274. for (int j = 1; j <= 3; j++) {
  275. if (i == 0 || i == 1) continue;
  276. while (stringTokenizer.hasMoreTokens()) {
  277. x = Integer.parseInt(stringTokenizer.nextToken());
  278. integers.add(x);
  279. System.out.println(integers);
  280. System.out.println("Array integers size: " + integers.size());
  281. }
  282. }
  283. stringTokenizer = new StringTokenizer(scanner.nextLine());
  284. }
  285. } catch (Exception e) {
  286. System.out.println("Koniec elementów: " + e);
  287. }
  288.  
  289. System.out.println(integers);
  290. System.out.println(integers.get(0));
  291. System.out.println(integers.get(1));
  292. System.out.println(integers.get(2));
  293. System.out.println(integers.get(4));
  294.  
  295.  
  296. DirectedGraph graph = new DirectedGraph(7);
  297. graph.addEdge(new DirectedEdge(integers.get(0), integers.get(1), integers.get(2)));
  298. graph.addEdge(new DirectedEdge(integers.get(3), integers.get(4), integers.get(5)));
  299. graph.addEdge(new DirectedEdge(0, 3, 7));
  300.  
  301. graph.addEdge(new DirectedEdge(1, 3, 1));
  302. graph.addEdge(new DirectedEdge(1, 5, 4));
  303.  
  304. graph.addEdge(new DirectedEdge(2, 3, 3));
  305. graph.addEdge(new DirectedEdge(2, 4, 5));
  306.  
  307. graph.addEdge(new DirectedEdge(3, 4, 2));
  308. graph.addEdge(new DirectedEdge(3, 5, 2));
  309. graph.addEdge(new DirectedEdge(3, 6, 7));
  310.  
  311. graph.addEdge(new DirectedEdge(4, 6, 2));
  312.  
  313. graph.addEdge(new DirectedEdge(5, 6, 4));
  314.  
  315. int source = 0;
  316. LoadDataFromFile shortestPath = new LoadDataFromFile(graph,
  317. source);
  318.  
  319. // Wyswietla najkrotsze sciezki
  320. for (int target = 0; target < graph.getNumberOfVertices(); target++) {
  321. if (shortestPath.hasPathTo(target)) {
  322. System.out.printf("%d do %d (%d) ", source, target,
  323. shortestPath.getDistanceTo(target));
  324. if (shortestPath.hasPathTo(target)) {
  325. for (DirectedEdge edge : shortestPath.getPathTo(target)) {
  326. System.out.print(edge);
  327. }
  328. }
  329. } else {
  330. System.out.printf("%d do %d - brak sciezki ", source, target);
  331. }
  332. System.out.println();
  333. }
  334. }
  335.  
  336. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement