BFS:图表中最短的到达时间

时间:2018-01-28 06:23:54

标签: java algorithm breadth-first-search

我正努力在hackercode的图形问题中获得最短的覆盖率。我设计了一个代码,一些测试用例很好,而一些测试用例因超时而终止。

你能说出我需要优化的地方,还请评论代码风格。我正在寻找改善它的方法。

以下是我的代码,

public class BFS {

    public static class Graph {
        public Node[] nodes;
        Stack<Node> stack = new Stack<Node>();

        public Graph(int size) {
            nodes = new Node[size];
        }

        public void addEdge(int first, int second) {
            Node nodeF = getNode(first);
            if (nodeF == null) {
                nodeF = new Node();
                nodeF.nodeVal = first;
            }
            Node nodeS = getNode(second);
            if (nodeS == null) {
                nodeS = new Node();
                nodeS.nodeVal = second;
            }
            nodeF.neighbours.add(nodeS);

            nodes[first] = nodeF;
            nodes[second] = nodeS;
        }

        public int[] shortestReach(int startId) { // 0 indexed
            stack.push(getNode(startId));
            int[] distance = new int[nodes.length];
            Arrays.fill(distance, -1);
            distance[startId] = 0;
            while (!stack.isEmpty()) {
                Node currentNode = stack.pop();
                Set<Node> children = getChildren(currentNode);
                for (Node node : children) {
                    distance[node.nodeVal] = distance[currentNode.nodeVal] + 6;
                    stack.add(node);
                }
            }
            return distance;
        }

        public Set<Node> getChildren(Node givenNode) {
            for (Node node : nodes) {
                if (node == givenNode) {
                    return node.neighbours;
                }
            }
            return null;
        }

        public Node getNode(int index) {
            return nodes[index];
        }

    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int queries = scanner.nextInt();

        for (int t = 0; t < queries; t++) {

            // Create a graph of size n where each edge weight is 6:
            Graph graph = new Graph(scanner.nextInt());
            int m = scanner.nextInt();

            // read and set edges
            for (int i = 0; i < m; i++) {
                int u = scanner.nextInt() - 1;
                int v = scanner.nextInt() - 1;

                // add each edge to the graph
                graph.addEdge(u, v);
            }

            // Find shortest reach from node s
            int startId = scanner.nextInt() - 1;
            int[] distances = graph.shortestReach(startId);

            for (int i = 0; i < distances.length; i++) {
                if (i != startId) {
                    if (distances[i] == 0)
                        continue;
                    System.out.print(distances[i]);
                    System.out.print(" ");
                }
            }
            System.out.println();
        }

        scanner.close();
    }
}

class Node {
    public int nodeVal;
    public Set<Node> neighbours = new HashSet<Node>();
}

0 个答案:

没有答案