Cod sursa(job #2076564)

Utilizator sebi_andrei2008Lazar Eusebiu sebi_andrei2008 Data 26 noiembrie 2017 19:39:53
Problema Algoritmul lui Dijkstra Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 3.69 kb
import java.io.*;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {

    private static PrintWriter printWriter;
    private static MyScanner scanner;

    private static final int MAX_N = 200;
    private static final int INFINITY = 2147483647;

    private static int[] dist = new int[MAX_N];
    private static int[] prev = new int[MAX_N];
    private static int[][] ponderi = new int[MAX_N][MAX_N];         // 0 here is actually INFINITY and -1 is actually 0

    public static void main(String[] args) throws IOException {
        scanner = new MyScanner("dijkstra.in");
        printWriter = new PrintWriter("dijkstra.out");

        PriorityQueue<Node> queue = new PriorityQueue<>(new NodeComparator());

        int n, m;
        n = scanner.nextInt();
        m = scanner.nextInt();

        for (int i = 0; i < m; i++) {
            int a = scanner.nextInt();
            int b = scanner.nextInt();
            int c = scanner.nextInt();
            if (c == 0)
                c = -1;
            ponderi[a][b] = c;
        }

        dist[1] = 0;
        queue.add(new Node(1, dist[1]));
        for (int i = 2; i <= n; i++) {
            dist[i] = INFINITY;
            queue.add(new Node(i, dist[i]));
        }

        while (!queue.isEmpty()) {
            Node node = queue.poll();

            for (int i = 1; i <= n; i++) {
                if (node.dist != INFINITY && ponderi[node.vertex][i] != 0) {
                    if (queue.contains(new Node(i, dist[i]))) {
                        int alt = node.dist;
                        if (ponderi[node.vertex][i] != -1)      //this would be 0
                            alt += ponderi[node.vertex][i];
                        if (alt < dist[i]) {
                            dist[i] = alt;
                            prev[i] = node.vertex;
                            queue.remove(new Node(i, dist[i]));
                            queue.add(new Node(i, dist[i]));
                        }
                    }
                }
            }
        }

        for (int i = 2; i <= n; i++)
            printWriter.printf("%d ", dist[i]);

        printWriter.close();
        scanner.close();
    }

    private static class Node {
        int vertex;
        int dist;

        Node(int vertex, int dist) {
            this.vertex = vertex;
            this.dist = dist;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;

            Node node = (Node) o;

            return vertex == node.vertex;
        }

        @Override
        public int hashCode() {
            return vertex;
        }
    }

    public static class NodeComparator implements Comparator<Node>
    {
        @Override
        public int compare(Node o1, Node o2) {
            int res = o1.dist - o2.dist;
            return res;
        }
    }

    private static class MyScanner
    {
        private BufferedReader bufferedReader;
        private StringTokenizer stringTokenizer;

        MyScanner(String filename) throws FileNotFoundException {
            bufferedReader = new BufferedReader(new FileReader(filename));
        }

        private String next() throws IOException {
            while(stringTokenizer == null || !stringTokenizer.hasMoreElements()) {
                stringTokenizer = new StringTokenizer(bufferedReader.readLine());
            }
            return stringTokenizer.nextToken();
        }

        int nextInt() throws IOException {
            return Integer.parseInt( next() );
        }

        void close() throws IOException {
            bufferedReader.close();
        }
    }
}