如何使用队列在Java中实现BFS(HW算法简介)?

如何使用队列在Java中实现BFS(HW算法简介)?,java,eclipse,algorithm,data-structures,breadth-first-search,Java,Eclipse,Algorithm,Data Structures,Breadth First Search,我尝试使用以下伪代码在Java中实现BFS算法: 1. for each vertex u ∈ G.V - {s} // for each vertex except for the source 2. u.color = WHITE // (line 1 cont) in the graph 3. u.distance = ∞ 4. u.parent = NIL 5. source.color = GRAY 6. sour

我尝试使用以下伪代码在Java中实现BFS算法:

1.   for each vertex u ∈ G.V - {s}  // for each vertex except for the source
2.       u.color = WHITE            // (line 1 cont) in the graph
3.       u.distance = ∞
4.       u.parent = NIL
5.   source.color = GRAY
6.   source.distance = 0
7.   source.parent = NIL
8.   Q = Ø
9.   Enqueue (Q, source)
10.  while Q != Ø
11.      u = Dequeue(Q)
12.      for each v ∈ G.Adj[u]              // for each adjacent vertext
13.            if v.color == WHITE
14.                  v.color = GRAY         
15.                  v.distance = u.distance + 1
16.                  v.parent = u
17.                  Enqueue(Q, v)
18.      u.color = BLACK
颜色表示每次访问该节点的时间:

  • 未发现白色=2

  • GRAY=3已被发现,但其相邻的邻居尚未全部被发现

  • BLACK=4被发现,所有相邻邻居都被发现,无需返回此处

  • u、 距离表示从节点到源节点的距离,u.parent是返回到源节点的父节点

    我的教授说,与其为每个节点创建一个对象(u.color、u.d、u.pi),不如为每个节点使用一个数组来存储每个节点的值

    他还为我们提供了框架代码,其中包括一个邻接矩阵来测试它

    --

    我目前正在努力解决第11行和第12行的问题。我能够创建和初始化所有数组以及队列,但在实现第11行中的queue.poll()queue.remove()函数时遇到了问题,无法按我的预期操作。我也不知道我是否正确地创建了for循环

    我尝试使用从LinkedList和Queue导入的.poll()和.remove()函数这应该做的是删除队列头并将其值赋给变量u,否?

    当我运行代码时,第17行会添加到队列中,但在下一次迭代中不会删除队列头,第18行只在第一次迭代(源节点)上执行。

    我不确定在使用正常的for循环(int v;v第12行,但我看到了其他示例,例如:for(Integer v:graph.adj[u]),但我不知道如何正确地实现它或找到.adj()方法的包

    我的结果:

    COLORS: [2, 3, 2, 2, 2, 2, 2, 2]
    DISTANCE: [2147483647, 0, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647]
    PARENT: [0, 0, 0, 0, 0, 0, 0, 0]
    
    COLORS: [3, 3, 2, 2, 2, 2, 2, 2]
    dist[u] = 0
    DISTANCE: [1, 0, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647]
    PARENT: [1, 0, 0, 0, 0, 0, 0, 0]
    QUEUE: []
    
    COLORS: [3, 3, 3, 2, 2, 2, 2, 2]
    dist[u] = 0
    DISTANCE: [1, 0, 1, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647]
    PARENT: [1, 0, 1, 0, 0, 0, 0, 0]
    QUEUE: [0]
    
    COLORS: [3, 3, 3, 3, 2, 2, 2, 2]
    dist[u] = 0
    DISTANCE: [1, 0, 1, 1, 2147483647, 2147483647, 2147483647, 2147483647]
    PARENT: [1, 0, 1, 1, 0, 0, 0, 0]
    QUEUE: [0, 2]
    
    COLORS: [3, 3, 3, 3, 3, 2, 2, 2]
    dist[u] = 0
    DISTANCE: [1, 0, 1, 1, 1, 2147483647, 2147483647, 2147483647]
    PARENT: [1, 0, 1, 1, 1, 0, 0, 0]
    QUEUE: [0, 2, 3]
    
    COLORS: [3, 3, 3, 3, 3, 3, 2, 2]
    dist[u] = 0
    DISTANCE: [1, 0, 1, 1, 1, 1, 2147483647, 2147483647]
    PARENT: [1, 0, 1, 1, 1, 1, 0, 0]
    QUEUE: [0, 2, 3, 4]
    
    COLORS: [3, 3, 3, 3, 3, 3, 3, 2]
    dist[u] = 0
    DISTANCE: [1, 0, 1, 1, 1, 1, 1, 2147483647]
    PARENT: [1, 0, 1, 1, 1, 1, 1, 0]
    QUEUE: [0, 2, 3, 4, 5]
    
    COLORS: [3, 3, 3, 3, 3, 3, 3, 3]
    dist[u] = 0
    DISTANCE: [1, 0, 1, 1, 1, 1, 1, 1]
    PARENT: [1, 0, 1, 1, 1, 1, 1, 1]
    QUEUE: [0, 2, 3, 4, 5, 6]
    
    我希望它最终会是这样的:

    COLORS: [4, 4, 4, 4, 4, 4, 4, 4]
    dist[u] = most recently removed from queue (not 0)
    DISTANCE: [1, 0, 2, 3, 2, 1, 2, 3]
    QUEUE: []
    

    while循环中的for循环不正确。由于给定了一个邻接矩阵表示形式,因此将图[][]设为矩阵,则具有以下属性

    图[i][j]==0,顶点i和j之间没有边; 图[i][j]==1,在顶点i和j之间有一条边

    假设有n个顶点,则for循环应为:

    for(int i = 0; i < n; i++) {
        if(Graph[u][i] == 1) {
            //put in the color/distance updates here
        }
    }
    
    for(int i=0;i

    您提到的其他示例(整数v:graph.adj[u])是图形的邻接列表表示形式。

    while循环中的for循环不正确。由于给定了一个邻接矩阵表示形式,因此将图[][]设为矩阵,则具有以下属性

    图[i][j]==0,顶点i和j之间没有边; 图[i][j]==1,在顶点i和j之间有一条边

    假设有n个顶点,则for循环应为:

    for(int i = 0; i < n; i++) {
        if(Graph[u][i] == 1) {
            //put in the color/distance updates here
        }
    }
    
    for(int i=0;i

    您提到的其他示例(整数v:graph.adj[u])是图形的邻接列表表示形式。

    您可能不应该使用
    返回距离
    循环时,
    中的code>。或者这仅仅是你的一部分出现了不好的凹痕?
    每个v∈ G.Adj[u]
    写得不正确,因为您的
    v
    循环根本没有使用
    u
    ,即不是“针对每个相邻的顶点”行是我写错的。在实际代码中,它不在while循环中。如何编写for循环?我看到我实现它的方式没有任何意义,但我真的不确定(在Java中)如何实现它?我没有在您的代码中看到
    G.Adj[u]
    (获取邻居)。要获得更多帮助,请发布您的代码,而不仅仅是发布的代码片段。看,您可能不应该使用
    返回dist
    循环时,
    中的code>。或者这仅仅是你的一部分出现了不好的凹痕?
    每个v∈ G.Adj[u]
    写得不正确,因为您的
    v
    循环根本没有使用
    u
    ,即不是“针对每个相邻的顶点”行是我写错的。在实际代码中,它不在while循环中。如何编写for循环?我看到我实现它的方式没有任何意义,但我真的不确定(在Java中)如何实现它?我没有在您的代码中看到
    G.Adj[u]
    (获取邻居)。要获得更多帮助,请发布您的代码,而不仅仅是发布的代码片段。看见
    for(int i = 0; i < n; i++) {
        if(Graph[u][i] == 1) {
            //put in the color/distance updates here
        }
    }