Pagini recente » Cod sursa (job #3169617) | Cod sursa (job #1699939) | Cod sursa (job #3175761) | Cod sursa (job #498075) | Cod sursa (job #2230078)
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
InputStream inputStream = new FileInputStream("dijkstra.in");
OutputStream outputStream = new FileOutputStream("dijkstra.out");
try (InputReader inputReader = new InputReader(inputStream);
PrintWriter printWriter = new PrintWriter(outputStream)) {
int numberNodes = inputReader.nextInt();
int numberEdges = inputReader.nextInt();
Graph graph = new Graph(numberNodes, numberEdges);
for (int edge = 0; edge < numberEdges; edge++) {
int from = inputReader.nextInt();
int to = inputReader.nextInt();
int cost = inputReader.nextInt();
graph.addEdge(from, to, cost);
}
int[] distancesFromNodeOne = Dijkstra.runFromNode(1, graph);
for (int i = 2; i <= numberNodes; i++) {
printWriter.print(distancesFromNodeOne[i] + " ");
}
}
}
static class Dijkstra {
private static final Integer INF = Integer.MAX_VALUE >> 1;
public static int[] runFromNode(int source, Graph graph) {
int[] costToNode = new int[graph.getNumberOfNodes() + 1];
Arrays.fill(costToNode, INF);
PriorityQueue<HeapEntry> candidateNodes = new PriorityQueue<>();
candidateNodes.add(new HeapEntry(source, 0));
while (!candidateNodes.isEmpty()) {
HeapEntry heapEntry = candidateNodes.poll();
// there may some outdated estimates for nodes
if (costToNode[heapEntry.node] < heapEntry.cost) {
continue;
}
costToNode[heapEntry.node] = heapEntry.cost;
int startEdge = graph.getLastEdge(heapEntry.node);
while (startEdge > 0) {
Graph.Edge edge = graph.getEdge(startEdge);
int newEstimate = heapEntry.cost + edge.cost;
if (costToNode[edge.to] > newEstimate) {
costToNode[edge.to] = newEstimate;
candidateNodes.add(new HeapEntry(edge.to, newEstimate));
}
startEdge = graph.getPrevEdge(startEdge);
}
}
// map unreachable nodes to 0 (required by the caller)
for (int i = 1; i <= graph.getNumberOfNodes(); i++) {
if (costToNode[i] == INF) {
costToNode[i] = 0;
}
}
return costToNode;
}
static class HeapEntry implements Comparable<HeapEntry> {
private int node;
private int cost;
public HeapEntry(int node, int cost) {
this.node = node;
this.cost = cost;
}
@Override
public int compareTo(HeapEntry o) {
return Integer.compare(cost, o.cost);
}
}
}
static class Graph {
private int N;
private Edge[] edges;
private int noEdges;
private int[] prevEdge;
private int[] lastEdge;
public Graph(int numberOfNodes, int numberOfEdges) {
this.N = numberOfNodes;
edges = new Edge[numberOfEdges + 1];
prevEdge = new int[numberOfEdges + 1];
lastEdge = new int[numberOfNodes + 1];
Arrays.fill(prevEdge, -1);
Arrays.fill(lastEdge, -1);
}
public void addEdge(int from, int to, int cost) {
int pos = lastEdge[from];
edges[++noEdges] = new Edge(to, cost);
prevEdge[noEdges] = pos;
lastEdge[from] = noEdges;
}
public int getNumberOfNodes() {
return N;
}
public int getLastEdge(int node) {
return lastEdge[node];
}
public int getPrevEdge(int edgeIdx) {
return prevEdge[edgeIdx];
}
public Edge getEdge(int idx) {
return edges[idx];
}
static class Edge {
private int to;
private int cost;
public Edge(int to, int cost) {
this.to = to;
this.cost = cost;
}
}
}
static class InputReader implements AutoCloseable {
private BufferedReader bufferedReader;
private StringTokenizer stringTokenizer;
public InputReader(InputStream inputStream) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
stringTokenizer = null;
}
private String nextToken() {
if (stringTokenizer == null || !stringTokenizer.hasMoreTokens()) {
try {
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return stringTokenizer.nextToken();
}
public int nextInt() {
return Integer.parseInt(nextToken());
}
@Override
public void close() throws IOException {
bufferedReader.close();
}
}
}