计算广度优先搜索中遍历的边数?

时间:2012-04-08 03:25:09

标签: java breadth-first-search

这是我的bfs算法。我想存储遍历在字段边缘的边数,但我无法确定将变量放在哪里为每个边添加一个。我总是得到太长的答案,所以我认为这比简单地增加边缘更难。

应该注意,这应该仅计算沿真实路径的边缘,而不是额外的边缘。

public int distance(Vertex x, Vertex y){
        Queue<Vertex> search = new LinkedList<Vertex>();
        search.add(x);
        x.visited = true;
        while(!search.isEmpty()){
            Vertex t = search.poll();
            if(t == y){
                return edges;
            }
            for(Vertex n: t.neighbours){
                if(!n.visited){
                    n.visited = true;
                    search.add(n);
                }

            }
            System.out.println(search + " " + t);
        }
        return edges;   
    }

感谢任何和所有帮助。如果您需要更多课程/方法,请告诉我

修改

import java.util.ArrayList;

public class Vertex {

    public static char currentID = 'a';
    protected ArrayList<Vertex> neighbours;
    protected char id;
    protected boolean visited = false;
    protected Vertex cameFrom = null;
    public Vertex(){
        neighbours = new ArrayList<Vertex>();
        id = currentID;
        currentID++;
        Graph.all.add(this);
    }
    public void addNeighbour(Vertex x){
        int a;
        while(x == this){
             a = (int) (Math.random()*(Graph.all.size()));
             x = Graph.all.get(a);
        }           
            if(!(neighbours.contains(x))){
                neighbours.add(x);
                x.addNeighbour(this);
                //System.out.println(this + " Linking to " + x);
            }
    }
    public void printNeighbours(){
        System.out.println("The neighbours of: " + id + " are: " + neighbours);
    }
    public String toString(){
        return id + "";
    }

}

2 个答案:

答案 0 :(得分:2)

Vertex课程中,创建一个Vertex cameFrom字段,您设置该字段以指向访问该节点时来自的Vertex。您甚至可以用boolean visited字段替换null字段(如果Vertex尚未访问Vertex y)。

然后,当您发现Vertex x时,只需按照指针返回Vertex计算您走的步数。

如果您不想更改Map<Vertex,Vertex>课程,请在搜索过程中保留 public int distance(Vertex x, Vertex y){ Queue<Vertex> search = new LinkedList<Vertex>(); search.add(x); while(!search.isEmpty()){ Vertex t = search.poll(); if(t == y){ return pathLength( t ); } for(Vertex n: t.neighbours){ if(n.cameFrom == null || n != x){ n.cameFrom = t; search.add(n); } } System.out.println(search + " " + t); } return -1; } public int pathLength( Vertex v ) { int path = 0; while ( v.cameFrom != null ) { v = v.cameFrom; path++; } return path; } ,以便存储从您正在访问的顶点到您来自的顶点的映射。当你走到尽头时,你可以按照相同的方式走到开头的路径。


沿着这些方向的东西也许:

{{1}}

答案 1 :(得分:1)

在此示例中,边数仅为search的大小。队列中。

编辑:

一种可能的解决方案是逐层进行。让我们说你要求Vertex A,F

之间的距离

,图表看起来像:

A
|\
B C
|
D
|\
E F

首先计算A和B之间的距离C(这很容易,因为B和C是A的直接邻居。然后计算A和D之间的距离(这很容易,因为D是B的直接邻居,那么A将距离存储在A顶点节点中。现在,在运行BFS并确定搜索结果后,您可以简单地询问距离。查看this视觉图。