[英]What's wrong in my BFS shortest path implementation in Java
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 之间的最短路径。
您正试图将一个元素添加到一个为空的链表中。 您需要在索引 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。
由于没有信息究竟是什么行为不符合预期,因此很难说出错误是什么。 但是我看到代码有两个问题:
首先,您不初始化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
所有元素进行初始化,则不需要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.