【问题标题】:Depth first traversal of connected graph using jung not showing right traversal使用jung的连通图的深度优先遍历不显示右遍历
【发布时间】:2013-04-15 04:46:54
【问题描述】:

我正在实现用户使用 jung 绘制的图形的深度优先遍历。

我现在有以下代码:

 public <V,E> void dftdraw(Graph<V,E> g) {
    V start = null;      
    for (V v:g.getVertices()){
        if(v.toString().equals("0"))
           start = v; 
    }

    Set visited = new HashSet();
    LinkedList stack = new LinkedList();
    stack.add(start);
    System.out.println(start.toString());
    // traverse through graph in depth-first order
    while (!stack.isEmpty())
    {
        V v = (V)stack.removeFirst();
        visited.add(v);
        Set neighbors = (Set) g.getNeighbors(v);

        for (Iterator n_it = neighbors.iterator(); n_it.hasNext(); )
        {
            V w = (V)n_it.next();

            if (!visited.contains(w)){
                System.out.println(w.toString());
                stack.addFirst(w);
            }
        }
    }
}

但这并不是先做深度,它首先打印出连接到起始顶点的顶点,而不是先遍历第一个连接的顶点,然后遍历它的连接顶点。

【问题讨论】:

  • 这个实现似乎是广度优先搜索。深度优先搜索最简单的实现是使用递归:en.wikipedia.org/wiki/Depth-first_search
  • 不,这甚至不是广度优先。它没有正确打印 BFS 遍历。

标签: java graph jung


【解决方案1】:

那是因为你太快打印顶点了。如果您希望它们按访问顺序打印,则需要在访问时打印(在从堆栈中删除顶点之后)。否则算法看起来没问题。

【讨论】:

    【解决方案2】:

    所以,现在我正在使用以下代码通过递归进行深度优先遍历:

    public <V, E> void dftdraw(Graph<V, E> g) {
    
        V start = null;
    
        for (V v : g.getVertices()) {
            if (v.toString().equals(jTextField2.getText())) {
                start = v;
            }
    
        }
    
        if(!visiteddfs.contains(start)) {
            dfspath(g,start);
        }
    
    
        for(int i=0;i<l2.size();i++){
    
            jTextField4.setText(jTextField4.getText() + " " + l2.get(i));
        }
    
    }
    
    public <V,E> void dfspath(Graph<V,E> g,V v){
    
        visiteddfs.add(v);
        l2.add(v);
        Set neighbors = (Set) g.getNeighbors(v);
            //System.out.println(v);
    
            for (Iterator n_it = neighbors.iterator(); n_it.hasNext();) {
                V w = (V) n_it.next();
    
            if(!visiteddfs.contains(w)){
    
                dfspath(g,w);
            }
    
        }
        finisheddfs.add(v);
    
    }
    

    并稍作修改,问题中发布的代码用于广度优先遍历。这是代码:

        public <V, E> void bstdraw(Graph<V, E> g) {
    
        V start = null;
    
        for (V v : g.getVertices()) {
            if (v.toString().equals(jTextField1.getText())) {
                start = v;
            }
        }
    
        Set visited = new HashSet();
        LinkedList stack = new LinkedList();
        stack.add(start);
        visited.add(start);
        l.add(start);
        // traverse through graph in depth-first order
        while (!stack.isEmpty()) {
            V v = (V) stack.removeFirst();
            Set neighbors = (Set) g.getNeighbors(v);
            //System.out.println(v);
    
            for (Iterator n_it = neighbors.iterator(); n_it.hasNext();) {
                V w = (V) n_it.next();
    
                if (!visited.contains(w)) {
                    l.add(w);
                    g2.addEdge("edge" + w, (Integer) v, (Integer) w);
                    jPanel4.repaint();
                    jPanel4.updateUI();
    
                    visited.add(w);
                    stack.addLast(w);
    
                }
            }
        }
    
        for (int i = 0; i < l.size(); i++) {
    
            jTextField3.setText(jTextField3.getText() + " " + l.get(i));
    
        }
    }
    

    【讨论】:

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