在图中的两个节点之间寻找路径(存储通过的节点)
Finding a way between two nodes in a grah (Storing the nodes passed)
我有一个图,我想找到两个节点(3 号和 5 号)之间的路径。
我读了关于在图中查找路径的内容,并尝试编写 DFS 和 BFS。两者都已实施并且运行良好。但是,我想获得从 3 到 5 直接访问的每个节点的列表。
两种算法都按预期工作,当 运行 bsf 我将按以下顺序访问节点:2,6,1,4,5。
使用 dfs 2,1,4,5。
但我想实现的是 6,5(在第一种情况下)和 2,4,5 在第二种情况下。
换句话说,我只想保存从 3 到 5 途中的节点(在 dfs/bfs 期间未访问所有节点),作为节点列表。
绞尽脑汁想了很久,怎么改代码实现,还是换个方式?我应该将节点存储在正确的路径中,还是使用不同的算法?我根本不知道该怎么做。
我的男朋友
public List<Node> bfs(Node root, Node nodeWeSearchFor)
{ Queue<Node> queue = new LinkedList<Node>();
List<Node> route = new ArrayList<Node>();
if(root == null || nodeWeSearchFor == null) return route;
//State is just an enum Visited or unvisited
root.state = State.Visited;
//Adds to end of queue
queue.add(root);
while(!queue.isEmpty())
{
//removes from front of queue
Node r = queue.remove();
//Visit child first before grandchild
for(Node n: r.getConnectedNodes())
{
if(n.state == State.Unvisited)
{
queue.add(n);
route.add(n);
n.state = State.Visited;
//If we found node, return
if(n==nodeWeSearchFor){
return route;
}
}
}
}
return route;}
我的dfs:
public List<Node> dfs(Node root, Node nodeWeSearchFor)
{
List<Node> route = new ArrayList<Node>();
//Avoid infinite loops
if(root == null) return route;
System.out.print(root.toString() + "\t");
root.state = State.Visited;
route.add(root);
if(root == nodeWeSearchFor) return route;
//for every child
for(Node n: root.getConnectedNodes())
{
//if childs state is not visited then recurse
if(n.state == State.Unvisited)
{
//recursive call for dfs (We are passing route)
dfs(n,nodeWeSearchFor,route);
}
}
return route;
}
public List<Node> dfs(Node root, Node nodeWeSearchFor,List<Node> _route)
{
List<Node> route = _route;
//Avoid infinite loops
if(root == null) return route;
System.out.print(root.toString() + "\t");
root.state = State.Visited;
route.add(root);
if(root == nodeWeSearchFor) return route;
//for every child
for(Node n: root.getConnectedNodes())
{
//if childs state is not visited then recurse
if(n.state == State.Unvisited)
{
dfs(n,nodeWeSearchFor,route);
}
}
return route;
}
这很容易,在DFS中,当你到达"end"(你不能前进)时,你必须"go back"。因此,当您要 "back" 时,您只需从已访问节点列表中删除 "dead end" 处的那个节点。
在 BFS 中,您必须为每个访问的节点创建新列表,复制 "opens him" 节点的已访问节点,然后将其自身添加到该列表中。
我有一个图,我想找到两个节点(3 号和 5 号)之间的路径。
我读了关于在图中查找路径的内容,并尝试编写 DFS 和 BFS。两者都已实施并且运行良好。但是,我想获得从 3 到 5 直接访问的每个节点的列表。 两种算法都按预期工作,当 运行 bsf 我将按以下顺序访问节点:2,6,1,4,5。 使用 dfs 2,1,4,5。 但我想实现的是 6,5(在第一种情况下)和 2,4,5 在第二种情况下。
换句话说,我只想保存从 3 到 5 途中的节点(在 dfs/bfs 期间未访问所有节点),作为节点列表。
绞尽脑汁想了很久,怎么改代码实现,还是换个方式?我应该将节点存储在正确的路径中,还是使用不同的算法?我根本不知道该怎么做。
我的男朋友
public List<Node> bfs(Node root, Node nodeWeSearchFor)
{ Queue<Node> queue = new LinkedList<Node>();
List<Node> route = new ArrayList<Node>();
if(root == null || nodeWeSearchFor == null) return route;
//State is just an enum Visited or unvisited
root.state = State.Visited;
//Adds to end of queue
queue.add(root);
while(!queue.isEmpty())
{
//removes from front of queue
Node r = queue.remove();
//Visit child first before grandchild
for(Node n: r.getConnectedNodes())
{
if(n.state == State.Unvisited)
{
queue.add(n);
route.add(n);
n.state = State.Visited;
//If we found node, return
if(n==nodeWeSearchFor){
return route;
}
}
}
}
return route;}
我的dfs:
public List<Node> dfs(Node root, Node nodeWeSearchFor)
{
List<Node> route = new ArrayList<Node>();
//Avoid infinite loops
if(root == null) return route;
System.out.print(root.toString() + "\t");
root.state = State.Visited;
route.add(root);
if(root == nodeWeSearchFor) return route;
//for every child
for(Node n: root.getConnectedNodes())
{
//if childs state is not visited then recurse
if(n.state == State.Unvisited)
{
//recursive call for dfs (We are passing route)
dfs(n,nodeWeSearchFor,route);
}
}
return route;
}
public List<Node> dfs(Node root, Node nodeWeSearchFor,List<Node> _route)
{
List<Node> route = _route;
//Avoid infinite loops
if(root == null) return route;
System.out.print(root.toString() + "\t");
root.state = State.Visited;
route.add(root);
if(root == nodeWeSearchFor) return route;
//for every child
for(Node n: root.getConnectedNodes())
{
//if childs state is not visited then recurse
if(n.state == State.Unvisited)
{
dfs(n,nodeWeSearchFor,route);
}
}
return route;
}
这很容易,在DFS中,当你到达"end"(你不能前进)时,你必须"go back"。因此,当您要 "back" 时,您只需从已访问节点列表中删除 "dead end" 处的那个节点。
在 BFS 中,您必须为每个访问的节点创建新列表,复制 "opens him" 节点的已访问节点,然后将其自身添加到该列表中。