Untitled
unknown
plain_text
a year ago
5.5 kB
6
Indexable
/* To change this license header, choose License Headers in Project Properties. To change this template file, choose Tools | Templates and open the template in the editor. */ package q1; import java.io.File; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.PriorityQueue; import java.util.Scanner; public class Q1 { String inputFile = "dijkstra_input2.txt"; String outputFile = "dijkstra_output2.txt"; //--VARIABLES - @STUDENT: DECLARE YOUR VARIABLES HERE: int N, M, s, e; List<List<Edge>> adj; int[] distance; int[] prev; String result = ""; //--FIXED PART - DO NOT EDIT ANY THINGS HERE-- //--START FIXED PART-------------------------- String fi, fo; /** * Set input and output file for automatic rating * @param args path of input file and path of output file */ public void setFile(String[] args) { fi = args.length >= 2 ? args[0] : inputFile; fo = args.length >= 2 ? args[1] : outputFile; } /** * Reads data from input file */ public void read() { try (Scanner sc = new Scanner(new File(fi))) { //--END FIXED PART---------------------------- //INPUT - @STUDENT: ADD YOUR CODE FOR INPUT HERE: N = sc.nextInt(); M = sc.nextInt(); s = sc.next().charAt(0) - 'A'; e = sc.next().charAt(0) - 'A'; adj = new ArrayList<>(); for (int i = 0; i < N; i++) { adj.add(new ArrayList<>()); } for (int i = 0; i < M; i++) { int u = sc.next().charAt(0) - 'A'; int v = sc.next().charAt(0) - 'A'; int d = sc.nextInt(); adj.get(u).add(new Edge(v, d)); adj.get(v).add(new Edge(u, d)); } //--FIXED PART - DO NOT EDIT ANY THINGS HERE-- //--START FIXED PART-------------------------- sc.close(); } catch (FileNotFoundException ex) { System.out.println("Input Exception # " + ex); } } //--END FIXED PART---------------------------- //ALGORITHM - @STUDENT: ADD YOUROWN METHODS HERE (IF NEED): private class Edge { int vertex, weight; Edge(int vertex, int weight) { this.vertex = vertex; this.weight = weight; } } private void dijkstra(int start) { distance = new int[N]; prev = new int[N]; Arrays.fill(distance, Integer.MAX_VALUE); Arrays.fill(prev, -1); distance[start] = 0; PriorityQueue<Edge> pq = new PriorityQueue<>((a, b) -> a.weight - b.weight); pq.add(new Edge(start, 0)); while (!pq.isEmpty()) { Edge current = pq.poll(); int u = current.vertex; int d = current.weight; if (d > distance[u]) continue; for (Edge edge : adj.get(u)) { int v = edge.vertex; int weight = edge.weight; if (distance[u] + weight < distance[v]) { distance[v] = distance[u] + weight; prev[v] = u; pq.add(new Edge(v, distance[v])); } } } } private List<Integer> getPath(int end) { List<Integer> path = new ArrayList<>(); for (int at = end; at != -1; at = prev[at]) { path.add(0, at); } return path; } //--FIXED PART - DO NOT EDIT ANY THINGS HERE-- //--START FIXED PART-------------------------- /** * Main algorithm */ public void solve() { //--END FIXED PART---------------------------- //ALGORITHM - @STUDENT: ADD YOUR CODE FOR OUTPUT HERE: dijkstra(s); List<Integer> path = getPath(e); result += distance[e] + "\n"; for (int i = 0; i < path.size(); i++) { result += ((char) (path.get(i) + 'A')); if (i < path.size() - 1) { result += ("->"); } } //--FIXED PART - DO NOT EDIT ANY THINGS HERE-- //--START FIXED PART-------------------------- } /** * Write result into output file */ public void printResult() { try { FileWriter fw = new FileWriter(fo); //--END FIXED PART---------------------------- //OUTPUT - @STUDENT: ADD YOUR CODE FOR OUTPUT HERE: fw.write(result); //--FIXED PART - DO NOT EDIT ANY THINGS HERE-- //--START FIXED PART-------------------------- fw.flush(); fw.close(); } catch (IOException ex) { System.out.println("Output Exception # " + ex); } } /** * @param args the command line arguments */ public static void main(String[] args) { Q1 q = new Q1(); q.setFile(args); q.read(); q.solve(); q.printResult(); } //--END FIXED PART---------------------------- }
Editor is loading...
Leave a Comment