【问题标题】:What's wrong in my BFS shortest path implementation in Java我在 Java 中的 BFS 最短路径实现有什么问题
【发布时间】:2016-07-09 14:12:38
【问题描述】:
import java.io.*;
import java.util.*;

class Graph
{
    private int V;   // No. of vertices
    private LinkedList<Integer> adj[]; //Adjacency Lists
    private LinkedList<Integer> path[];


    Graph(int v)
    {
        V = v;
        adj = new LinkedList[v];
        for (int i=0; i<v; ++i)
            adj[i] = new LinkedList();
        path = new LinkedList[v];
        for(int i=0;i<v;++i)
            adj[i]=new LinkedList();
    }


    void addEdge(int v,int w)
    {
        adj[v].add(w);
    }

    // prints BFS traversal from a given source s
    void BFS(int s,int d)
    {
        boolean visited[] = new boolean[V];
        LinkedList<Integer> queue = new LinkedList<Integer>();


        visited[s]=true;
        queue.add(s);
        path[s].addLast(s);
        while (queue.size() != 0)
        {

            s = queue.poll();
            //System.out.print(s+" ");


            Iterator<Integer> i = adj[s].listIterator();
            while (i.hasNext())
            {
                int n = i.next();
                if (!visited[n])
                {
                    visited[n] = true;
                    queue.add(n);
                    path[n]=path[s];
                    path[n].addLast(n);
                }
            }
        }

        System.out.print("Following is the path from source to destination\n");
        while(path[d].size()!=0)
        {
            int xyz=path[d].getFirst();
            path[d].poll();
            System.out.print(xyz+" ");
        }
    }

    // Driver method to
    public static void main(String args[])
    {
        Graph g = new Graph(4);

        g.addEdge(0, 1);
        g.addEdge(0, 2);
        g.addEdge(1, 2);
        g.addEdge(2, 0);
        g.addEdge(2, 3);
        g.addEdge(3, 3);

        System.out.println("Following is the desired path\n");

        g.BFS(2,3);
    }
}

我需要得到节点 2 和 3 之间的最短路径。

【问题讨论】:

    标签: java algorithm graph-algorithm shortest-path breadth-first-search


    【解决方案1】:

    您正试图将一个元素添加到一个为空的链表。您需要先在索引 s 处初始化链表,然后才能添加。

    path[s] = new LinkedList();
    path[s].addLast(s);
    

    另外,您的代码失败了,因为您在设置 path[n] 的值时没有克隆路径数组:

    path[n]=path[s];
    

    您需要将其更改为:

    path[n]= (LinkedList) path[s].clone();
    

    这样,n 的列表不会保留对 s 列表的引用。目前,该引用被保留,因此每当您向 n 的列表添加某些内容时,该内容也将添加到 s 中。

    【讨论】:

      【解决方案2】:

      由于没有确切的信息不符合预期,因此很难说出错误是什么。但我发现代码有两个问题:

      首先,您不初始化path 的元素。相反,在构造函数中,您将 adj 的元素初始化了两次。因此,您应该替换其中的一行

      for(int i=0; i<v; ++i)
           adj[i] = new LinkedList();
      

      for(int i=0; i<v; ++i)
           path[i] = new LinkedList();
      

      或者你也可以像现在看到的那样删除这两行:

      第二个问题是您将path的不同元素设置为对另一个LinkedList的引用并对其进行编辑:

      path[n] = path[s];
      path[n].addLast(n);
      

      这导致path 的每个元素都使用具有相同元素的相同LinkedList。相反,您应该创建一个包含相同元素的新 LinkedList:

      path[n] = new LinkedList(path[s]);
      path[n].addLast(n);
      

      编辑:正如 Soggiorno 在他的回答中所说,在向其添加元素之前,您必须至少在 BFS 方法的开头初始化 path[s]

      path[s] = new LinkedList();
      path[s].addLast(s);
      

      如果您对path 的所有元素进行初始化,当然不需要这样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多