Cod sursa(job #1474811)

Utilizator vcalinCalin Velea vcalin Data 23 august 2015 00:02:52
Problema Algoritmul lui Dijkstra Scor 80
Compilator java Status done
Runda Arhiva educationala Marime 2.99 kb
//package com.infoarena;

import java.io.*;
import java.util.*;


public class Main {
    int m, n;

    class qNode implements Comparable<qNode> {
        int node;
        int dv;

        qNode(int node, int dv) {
            this.node = node;
            this.dv = dv;
        }

        public int compareTo(qNode o) {
            return this.dv - o.dv;
        }
    }

    class Node {
        int node;
        int cost;

        Node(int node, int cost) {
            this.node = node;
            this.cost = cost;
        }
    }

    ArrayList<ArrayList<Node>> graph;
    int[] sp;
    PriorityQueue<qNode> pq;
    boolean[] inQueue;

    void readInput() throws Exception
    {
        String inputFile = "dijkstra.in";
        BufferedReader br = new BufferedReader(new FileReader(inputFile));

        String[] num = br.readLine().split(" ");
        n = Integer.parseInt(num[0]);
        m = Integer.parseInt(num[1]);

        graph = new ArrayList<>(n);
        inQueue = new boolean[n];
        sp = new int[n];
        for (int i = 0; i < n; i++) {
            ArrayList<Node> nodelist = new ArrayList<>();
            graph.add(nodelist);
            inQueue[i] = false;
            sp[i] = Integer.MAX_VALUE;
        }
        pq = new PriorityQueue<>(n);

        for(int i = 0; i < m; i++) {
            String[] edge = br.readLine().split(" ");

            ArrayList<Node> nodes = graph.get(Integer.parseInt(edge[0]) - 1);
            Node n = new Node(Integer.parseInt(edge[1]) - 1, Integer.parseInt(edge[2]));
            nodes.add(n);
        }
        br.close();
    }

    void writeOutput() throws Exception
    {
        String outputFile = "dijkstra.out";
        PrintWriter writer = new PrintWriter(outputFile);

        for(int i = 1; i < n; i++) {
            writer.print(sp[i] + " ");
        }
        writer.println();
        writer.close();
    }

    void execute()
    {
        pq.add(new qNode(0, 0));
        inQueue[0] = true;
        sp[0] = 0;

        while (!pq.isEmpty()) {
            qNode qn = pq.remove();
            inQueue[qn.node] = false;
            for (int i = 0; i < graph.get(qn.node).size(); i++) {
                Node n = graph.get(qn.node).get(i);
                int dist_new = sp[qn.node] + n.cost;
                if(sp[n.node] >= dist_new) {
                    qNode qnn = new qNode(n.node, dist_new);
                    sp[n.node] = dist_new;
                    if(!inQueue[qnn.node]) {
                        pq.add(qnn);
                        inQueue[qn.node] = true;
                    }
                }
            }
        }

        for(int i = 0; i < n; i++) {
            if(sp[i] == Integer.MAX_VALUE) {
                sp[i]=0;
            }
        }
    }

    public static void main(String[] args) throws Exception
    {
        Main main = new Main();
        main.readInput();
        main.execute();
        main.writeOutput();
    }
}