【问题标题】:Depth First Search on graph java图 java 上的深度优先搜索
【发布时间】:2016-10-15 15:05:35
【问题描述】:

我在 java 中实现 DFS 遍历时遇到了一点问题。我认为我的问题是我编码的 Graph.java 中的“dfs”方法。它没有返回所需的输出,给它一个特定的输入。我的代码及其输入和所需的输出如下。有人可以帮我在我的代码中解决这个问题。谢谢。

Graph.java

public class Graph {
ArrayList<Vertex> Vertices=new ArrayList<Vertex>();
Stack<Integer> stack=new Stack<Integer>();
public Graph(){
    Scanner in=new Scanner(System.in);
    String sz=in.nextLine();
    int size=Integer.parseInt(sz);
    for(int i=0; i<size; i++) addVertex();
    String s=in.nextLine();
    while(!s.equals("-1")){
        String[] arr=s.split(",");
        int v1=Integer.parseInt(arr[0]);
        int v2=Integer.parseInt(arr[1]);
        addEdge(v1,v2);
        s=in.nextLine();
    }

    //Vertex v=Vertices.get(2);
    //System.out.println(dfs(v));
}

public static void main(String[] args){
    new Graph();
}
public void addVertex(){
    Vertex v=new Vertex(Vertices.size());
    Vertices.add(v);
}
public Vertex getVertex(int n){
    return Vertices.get(n);
}
public void addEdge(int n, int m){
    Vertex v1=Vertices.get(n);
    Vertex v2=Vertices.get(m);
    v1.addAdjacency(v2);
    v2.addAdjacency(v1);
}
public void dfs(Vertex obj){
    obj.marked=true;
    int k=0;
    for(Vertex v:obj.Vertices){
        Vertex d=v;
        if(!d.marked){
            d.parent=obj;
            k=d.parent.vertexNumber;
            stack.push(k);
            dfs(d);
        }
    }
}
}

Vertex.java

public class Vertex {
int vertexNumber;
Vertex parent = null;
boolean marked = false;
LinkedList<Vertex> Vertices = new LinkedList<Vertex>();

public Vertex(int num) {
    vertexNumber = num;
}

public void addAdjacency(Vertex object) {
    Vertices.add(object);
}

public boolean isAdjacent(Vertex object) {
    if (Vertices.contains(object))
        return true;
    else
        return false;
}

public int getDegree() {
    return Vertices.size();
}

}

【问题讨论】:

  • 我已经编辑了 DFS 方法
  • dfs 方法返回void。您如何期望使用 System.out.println(dfs(v)); 打印任何内容?它甚至不会编译。
  • 让我纠正一下,它应该被注释掉
  • 如果您希望我们提供帮助,您确实需要解释您的示例输出。你没有说这是哪个源顶点的结果(它看起来像你的代码中的顶点 2?),也没有说 1:0 的真正含义或它应该是什么。这些应该是您问题的一部分。
  • 输出样本不清楚。

标签: java graph depth-first-search


【解决方案1】:

你几乎拥有它。您不需要 dfs 中的堆栈。像这样简化它:

public void dfs(Vertex obj) {
    obj.marked = true;
    for (Vertex v : obj.Vertices) {
        if (!v.marked) {
            v.parent = obj;
            dfs(v);
        }
    }
}

只需在您的主目录中打印结果:

public static void main(String[] args) {
    Graph g = new Graph();
    Vertex source = g.Vertices.get(0);
    g.dfs(source);

    for(Vertex v:g.Vertices){
        if (v!= source && v.marked){
            System.out.println(v.vertexNumber+":"+v.parent.vertexNumber);
        }
    }
}

您只是调用 dfs,标记任何可访问的内容并更新父项。完成后,只需遍历所有顶点并打印可到达的顶点(源本身除外)。

这是我得到的输出:

1:0 
2:1 
3:8 
4:5 
5:6 
6:2 
7:10 
8:7 
9:5 
10:5

我还建议您重构代码并将命令行读取移动到您的 main 而不是 Graph 构造函数。只需阅读数字并致电g.addEdge 即可构建您的图表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多