Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.18 KB | None | 0 0
  1. import java.io.*;
  2. import java.lang.reflect.Array;
  3. import java.nio.file.Files;
  4. import java.nio.file.Paths;
  5. import java.util.*;
  6. import java.util.concurrent.atomic.AtomicInteger;
  7. import java.util.stream.Collectors;
  8. import java.util.stream.IntStream;
  9.  
  10. //Beispielcode zur Orientierung für Übungsblatt 8
  11. public class Kruskal {
  12.  
  13. // Funktion zum Einlesen eines Files
  14. public static ArrayList<String> read(String fileName) {
  15.  
  16. ArrayList<String> data = new ArrayList<>();
  17.  
  18. try {
  19. BufferedReader reader = new BufferedReader(
  20. new FileReader(fileName));
  21.  
  22. String line = "";
  23.  
  24. while (line != null) {
  25.  
  26. line = reader.readLine();
  27.  
  28. if (line != null) {
  29. data.add(line);
  30. }
  31.  
  32. }
  33. reader.close();
  34.  
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. }
  38.  
  39. return data;
  40. }
  41.  
  42.  
  43. // Funktion zum Schreiben in einen File
  44. public static void write(String fileName, ArrayList<?> data) {
  45. try {
  46. BufferedWriter writer = new BufferedWriter(
  47. new FileWriter(fileName));
  48.  
  49. for (int i = 0; i < data.size(); i++)
  50. writer.write(data.get(i).toString() + "\n");
  51.  
  52. writer.close();
  53. } catch (Exception e) {
  54. e.printStackTrace();
  55. }
  56. }
  57.  
  58. // Kantenklasse
  59. private static class Edge implements Comparable<Edge> {
  60.  
  61. int s, t, c;
  62. G graph;
  63.  
  64. Edge(G g, int s, int t, int c) {
  65. this.s = s;
  66. this.t = t;
  67. this.c = c;
  68. this.graph = g;
  69. }
  70.  
  71.  
  72. Edge() {
  73.  
  74. s = -1;
  75. t = -1;
  76. c = -1;
  77. }
  78.  
  79. public String toString() {
  80.  
  81. String sedge = "" + s + " " + t + " " + c;
  82. return sedge;
  83. }
  84.  
  85. @Override
  86. public int compareTo(Edge e) {
  87. if (e != null) {
  88. return Integer.compare(this.c, e.c);
  89. }
  90. throw new ClassCastException("Objects is null");
  91. }
  92. }
  93.  
  94. // Knotenklasse
  95. private static class Node {
  96.  
  97. int ID;
  98.  
  99. float lat, lon;
  100.  
  101. ArrayList<Edge> outwardEdge, inwardEdge;
  102.  
  103.  
  104. Node(int ID, float lat, float lon) {
  105.  
  106. this.ID = ID;
  107. this.lat = lat;
  108. this.lon = lon;
  109. outwardEdge = new ArrayList<Edge>();
  110. inwardEdge = new ArrayList<Edge>();
  111. }
  112.  
  113.  
  114. public String toString() {
  115.  
  116. String snode = "" + ID + " " + lat + " " + lon;
  117. return snode;
  118. }
  119.  
  120. }
  121.  
  122.  
  123. // Graphklasse
  124. private static class G {
  125. Node[] nodes;
  126.  
  127. ArrayList<Edge> edges;
  128.  
  129. //Konstruktor
  130. G(ArrayList<String> data) {
  131.  
  132. //Einlesen der Knoten und Kanten
  133. int n = Integer.parseInt(data.get(0));
  134. int m = Integer.parseInt(data.get(1));
  135.  
  136. nodes = new Node[n];
  137. edges = new ArrayList<>();
  138.  
  139. System.out.println("read graph with " + n + " nodes and " + m + " edges");
  140.  
  141.  
  142. for (int i = 2; i < n + 2; i++) {
  143. String[] vpr = null;
  144. vpr = data.get(i).split("\\s+");
  145. float lat = Float.parseFloat(vpr[0]);
  146. float lon = Float.parseFloat(vpr[1]);
  147. Node node = new Node(i - 2, lat, lon);
  148. nodes[i - 2] = node;
  149. }
  150.  
  151.  
  152. for (int i = n + 2; i < n + m + 2; i++) {
  153. String[] vpr;
  154. vpr = data.get(i).split("\\s+");
  155. int sourceNode, targetNode, cost;
  156. sourceNode = Integer.parseInt(vpr[0]);
  157. targetNode = Integer.parseInt(vpr[1]);
  158. cost = Integer.parseInt(vpr[2]);
  159.  
  160. Edge edge = new Edge(this, sourceNode, targetNode, cost);
  161. nodes[sourceNode].outwardEdge.add(edge);
  162. nodes[targetNode].inwardEdge.add(edge);
  163.  
  164. Edge bedge = new Edge(this, targetNode, sourceNode, cost);
  165. nodes[sourceNode].inwardEdge.add(bedge);
  166. nodes[targetNode].outwardEdge.add(bedge);
  167.  
  168. edges.add(edge);
  169. edges.add(bedge);
  170.  
  171. }
  172.  
  173. }
  174.  
  175.  
  176. public List<Integer> kruskalMST() {
  177. UnionFind uf = new UnionFind(nodes.length);
  178. Collections.sort(edges);
  179. List<Edge> ePrime = new ArrayList<>();
  180. for (Edge e : edges) {
  181. if (uf.findSet(e.s) != uf.findSet(e.t)) {
  182. ePrime.add(e);
  183. uf.union(e.s, e.t);
  184. }
  185. }
  186. return ePrime.stream().map(e -> e.c).collect(Collectors.toList());
  187. }
  188. }
  189.  
  190. public static class UnionFind {
  191.  
  192. int[] refs;
  193. boolean[] reps;
  194.  
  195. UnionFind(int n) {
  196. AtomicInteger counter = new AtomicInteger(-1);
  197. refs = IntStream.generate(counter::incrementAndGet).limit(n).toArray();
  198. reps = new boolean[n];
  199. Arrays.fill(reps, true);
  200. }
  201.  
  202. private int findSet(int id) {
  203. // id already is a base reference
  204. if (reps[id]) {
  205. return id;
  206. } else {
  207. //recursively look for a base reference
  208. return findSet(refs[id]);
  209. }
  210. }
  211.  
  212. public void union(int v, int w) {
  213. int rep = findSet(v);
  214. refs[rep] = w;
  215. reps[rep] = false;
  216. }
  217. }
  218.  
  219.  
  220. public static void main(String args[]) {
  221. System.out.println("lel");
  222. long start = System.currentTimeMillis();
  223. if (args.length < 2)
  224. return;
  225.  
  226. ArrayList<String> data = read(args[0]);
  227. G graph = new G(data);
  228. // Berechne Spannwald
  229. List<Integer> MSTedges = graph.kruskalMST();
  230. long end = System.currentTimeMillis();
  231. System.out.println("Time elapsed: " + (end - start) + "ms");
  232. write(args[1], new ArrayList<>(MSTedges));
  233. System.out.println("Here you go bb");
  234.  
  235. }
  236.  
  237. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement