Cod sursa(job #1311503)

Utilizator Iustin_BulimarFMI Iustin Bulimar Iustin_Bulimar Data 8 ianuarie 2015 12:07:49
Problema Algoritmul Bellman-Ford Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 2.28 kb


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

public class Main {
    static public class Edge {
    Node firstNode;
    Node secondNode;
    int weight;
    
    public Edge() {
        firstNode = new Node();
        secondNode = new Node();
    }
};
    static public class Node {
    int index;
    int weight;
    Node ancestor;
};
    
    public static void main(String[] args) throws FileNotFoundException {
        Scanner scanner = new Scanner(new File("bellmanford.in"));
        PrintWriter printer = new PrintWriter(new File("bellmanford.out"));
        ArrayList<Edge> graph = new ArrayList<>();
        int numberOfNodes = scanner.nextInt();
        int numberOfEdges = scanner.nextInt();
        
        ArrayList<Node> nodes = new ArrayList<>();
        for(int i = 0; i < numberOfNodes; i++) {
            Node node = new Node();
            node.index = i;
            node.weight = Integer.MAX_VALUE;
            nodes.add(node);
        }
        nodes.get(0).weight = 0;
        
        for(int i = 0; i < numberOfEdges; i++) {
            Edge edge = new Edge();
            int index;
            index = scanner.nextInt();
            edge.firstNode = nodes.get(index);
            edge.firstNode.index = index;
            index = scanner.nextInt();
            edge.secondNode = nodes.get(index);
            edge.secondNode.index = index;
            edge.weight = scanner.nextInt();
            graph.add(edge);
        }
        
        for(int i = 0; i < numberOfNodes - 1; i++) 
            for(Edge edge : graph)  {
                if(edge.secondNode.weight > edge.firstNode.weight + edge.weight) {
                    edge.secondNode.weight = edge.firstNode.weight + edge.weight;
                    edge.secondNode.ancestor = edge.firstNode;
                }
            }
        boolean hasNegativeCycle = false;
        for(Edge edge : graph) 
                if(edge.secondNode.weight > edge.firstNode.weight + edge.weight) {
                    hasNegativeCycle = true;
                    break;
                }
        if(hasNegativeCycle)
            printer.println("Ciclu negativ!");
        else
            for(int i = 1; i < numberOfNodes; i++)
                printer.println(nodes.get(i).weight);
    }
    
}