在广度优先搜索中计算级别(起始节点和目标节点之间的距离)

时间:2014-03-22 16:16:20

标签: java data-structures breadth-first-search

任何人都可以帮我使用Java中的广度优先搜索来计算图表的访问级别吗?

这是我的方法,我有启动节点(str)和结束节点(目标),当循环到达目标节点时,它应该停止。

我现在想要的是计算从起始节点到结束节点的级别。

public void bfs(String str,String goal) {
    int strInx = findIndex(str);
    vertexList[strInx].wasVisited = true;
    theQueue.insert(strInx);
    int v2;
    boolean bre = false;
    while (!theQueue.isEmpty()) {
        System.out.println(vertexList[theQueue.getFront()].label);
        int v1 = theQueue.remove();
        while ((v2 = getAdjUnvisitedVertex(v1)) != -1) {
            vertexList[v2].wasVisited = true;
            System.out.println("--V2--->"+vertexList[v2].label);
            theQueue.insert(v2);

            if(goal.equals(vertexList[v2].label)) {
                bre=true;
                break;
            }
        }
        if(bre) 
            break;   
    }                
    for (int j = 0; j < nVerts; j++) {
        vertexList[j].wasVisited = false;
    }
}

2 个答案:

答案 0 :(得分:4)

您可以使用以下方法之一跟踪当前级别:

  1. 使用两个队列而不是一个:currentLevelQueue和nextLevelQueue

  2. 使用一个队列跟踪另一个队列以跟踪相关级别

  3. 使用包含级别字段的包装类并在队列中存储此类的实例

答案 1 :(得分:1)

我有一个类似的要求,我必须计算bfs算法中的水平。我是通过创建一个levelMap&gt;的hashmap来实现的。 整数是级别号... nodes是同一级别的节点列表...... 这帮我找到了什么时候通过递增水平计数器来进入下一级...同时做bfs ..

伪代码:

    HashMap<Integer, ArrayList<Node>> levelMap = new HashMap<Integer, ArrayList<Node>>();

....                 int currentLevelFromMap = getCurrLevelFromMap(levelMap,currentNode);

            currentLevel = currentLevelFromMap + 1;

            if (currentLevelNodeList.size() != 0) {
                levelMap.put(currentLevel, currentLevelNodeList);
            }

currentLevelNodesList是算法

的特定迭代中的节点列表