Cod sursa(job #2086514)

Utilizator abitlazyabitlazy abitlazy Data 12 decembrie 2017 09:52:15
Problema Algoritmul lui Dijkstra Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 2.5 kb
import java.io.*;
import java.util.*;

import javax.print.attribute.standard.RequestingUserName;

public class Main {
	private static final String INPUT_FILE_PATH = "src/dijkstra.in";
	private static final String OUTPUT_FILE_PATH = "src/dijkstra.out";

	public static void main(String[] args) throws IOException {
		Scanner in = new Scanner(new FileReader(INPUT_FILE_PATH));
		PrintWriter out = new PrintWriter(OUTPUT_FILE_PATH);
		int n = in.nextInt();
		int m = in.nextInt();
		DirectedGraph mGraph = new DirectedGraph(n);
		while (m-- > 0) {
			int source = in.nextInt();
			int dest = in.nextInt();
			int cost = in.nextInt();
			mGraph.insertEdge(source, dest, cost);
		}
		Long[] distances = mGraph.getShortestPaths(1);
		for (int i = 2; i <= n; ++i) {
			out.print(((Long.compare(distances[i], Long.MAX_VALUE) != 0) ? distances[i] : 0L) + " ");
		}
		out.flush();
		in.close();
		out.close();
	}

	static class DirectedGraph {

		static class Edge {
			int dest;
			long cost;

			public Edge(int dest, int cost) {
				this.dest = dest;
				this.cost = (long) cost;
			}
		}

		List<List<Edge>> neighbors;

		public DirectedGraph(int vertices) {
			this.neighbors = new ArrayList<>();
			for (int i = 0; i < vertices + 1; ++i) {
				this.neighbors.add(new ArrayList<Edge>());
			}
		}

		public void insertEdge(int source, int dest, int cost) {
			if (this.neighbors.size() > 0) {
				this.neighbors.get(source).add(new Edge(dest, cost));
			}
		}

		public Long[] getShortestPaths(int source) {
			Long[] dist = new Long[this.neighbors.size()];
			Arrays.fill(dist, Long.MAX_VALUE);
			dist[source] = 0L;
			PriorityQueue<GraphTuple> minHeap = new PriorityQueue<>();
			minHeap.add(new GraphTuple(1, dist[source]));
			while (!minHeap.isEmpty()) {
				int currVertex = minHeap.poll().vertex;
				List<Edge> currNeighbors = this.neighbors.get(currVertex);
				for (Edge edge : currNeighbors) {
					if (dist[edge.dest] > dist[currVertex] + edge.cost) {
						dist[edge.dest] = dist[currVertex] + edge.cost;
						minHeap.add(new GraphTuple(edge.dest, dist[edge.dest]));
					}
				}
			}
			return dist;
		}

		static class GraphTuple implements Comparable<GraphTuple> {
			int vertex;
			long cost;

			public GraphTuple() {
			}

			public GraphTuple(int vertex, long cost) {
				this.vertex = vertex;
				this.cost = cost;
			}

			@Override
			public int compareTo(GraphTuple that) {
				return Long.compare(this.cost, that.cost);
			}

		}

	}

}