java - 为什么 BFS 卡在图节点表示中?

标签 java graph breadth-first-search

我已经使用 Node 和 Edge 类创建了图形。

当我打电话时traverseBFS方法来自 start = 0 .然后它就卡住了。无法进一步进行。当我对 HashMap<Integer,ArrayList<Integer>> 使用类似的方法时该算法运行正常。请帮我解决这个问题。

Complete Code


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

public class Dijkstra {
    static class Node {
        public int id;
        public long dist;
        public int par;

        public Node(int a, long d, int b) {
            id = a;
            dist = d;
            par = b;
        }
    }

    static class Edge {
        int to;
        int weight;

        public Edge(int a, int b) {
            to = a;
            weight = b;
        }
    }

    static int vert;
    static ArrayList<LinkedList<Edge>> list;
    static int[] parent;
    static long[] distance;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        vert = sc.nextInt();
        int edges = sc.nextInt();
        list = new ArrayList<>();
        parent = new int[vert + 1];
        distance = new long[vert + 1];

        for (int i = 0; i <= vert; i++) {
            list.add(i, new LinkedList<Edge>());
        }

        for (int i = 0; i < edges; i++) {
            int u = sc.nextInt();
            int v = sc.nextInt();
            int w = sc.nextInt();
            list.get(u).add(new Edge(v, w));
            list.get(v).add(new Edge(u, w));
        }
        traverseBFS(0);
    }
    public static void traverseBFS(int start) {
        System.out.print("\nBFS >> \n");
        boolean visited[] = new boolean[vert];
        LinkedList<Integer> q = new LinkedList<>();
        q.add(start);
        visited[start] = true;

        while (!q.isEmpty()) {
            int s = q.poll();
            System.out.print(s + " ");

            LinkedList<Edge> temp = list.get(s);
            for (Edge var : temp) {
                if (!visited[var.to]) {
                    visited[var.to] = true;
                    q.add(var.to);

                }
            }
        }
    }

}



Input



5 6

1 2 2

2 5 5

2 3 4

1 4 1

4 3 3

3 5 1

Output



BFS >>

0

最佳答案

发帖时mre考虑硬编码测试数据,以便更轻松地运行测试:

public static void main(String[] args) {

    int[][] neighbours = {

            {1,2,2},

            {2,5,5},

            {2,3,4},

            {1,4,1},

            {4,3,3},

            {3,5,1}
    };

    vert = 5;

    list = new ArrayList<>();
    parent = new int[vert + 1];
    distance = new long[vert + 1];

    for (int i = 0; i <= vert; i++) {
        list.add(i, new LinkedList<Edge>());
    }

    for (int i = 0; i < neighbours.length; i++) {
        int u = neighbours[i][0];
        int v = neighbours[i][1];
        int w = neighbours[i][2];
        list.get(u).add(new Edge(v, w));
        list.get(v).add(new Edge(u, w));
    }

    traverseBFS(0);
}

创建的图形的简单打印显示节点 0 未连接到任何其他节点:

Node 0 connected: []
Node 1 connected: [to 2, to 4]
Node 2 connected: [to 1, to 5, to 3]
Node 3 connected: [to 2, to 4, to 5]
Node 4 connected: [to 1, to 3]
Node 5 connected: [to 2, to 3]



为了简化打印输出添加 toString边缘的方法:
static class Edge {
    int to;
    int weight;

    public Edge(int a, int b) {
        to = a;
        weight = b;
    }

    @Override
    public String toString() {
        return "to "+to;
    }
}

并使用
  for(int node = 0; node < list.size(); node ++){
     System.out.println("Node "+node +" connected: " + list.get(node));
  }

关于java - 为什么 BFS 卡在图节点表示中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61868794/

相关文章:

mysql - 如何使用 Shiny 的mysql表创建图形?

ruby - children 变量数组中的这段代码是什么意思?

haskell - 级序repminPrint

java - 基本 Java 语法问题

algorithm - 连通图中的 K-Clique

algorithm - 在无向加权图中找到最便宜的循环

java - 广度优先搜索(高峰时间) - 链表队列包含同一板的重复项

java - Eclipse 中的 GWT 编译错误

java - 比较 Visual Basic sql 和 Java sql

java - 通过网络发送数据时触发 Android 事件。检测网络使用情况