【问题标题】:DepthFirstSearch java implementation深度优先搜索java实现
【发布时间】:2018-12-07 13:19:35
【问题描述】:

我正在尝试学习如何在 java 中实现图形(深度优先搜索)。 这是一段代码,我不明白字符在这里的含义。就是关于这段代码:

    private void dfs(Graph G, int v) {
    count++;
    marked[v] = true;
    for (int w : G.adj(v)) {
        if (!marked[w]) {
            dfs(G, w);
        }
    }
}

我不明白“w”是什么意思?!

谢谢。

编辑:这是完整的代码,也许它会帮助你更多地了解这里发生了什么:

package edu.princeton.cs.algs4;

public class DepthFirstSearch {
    private boolean[] marked;    // marked[v] = is there an s-v path?
    private int count;           // number of vertices connected to s


    public DepthFirstSearch(Graph G, int s) {
        marked = new boolean[G.V()];
        validateVertex(s);
        dfs(G, s);
    }


    private void dfs(Graph G, int v) {
        count++;
        marked[v] = true;
        for (int w : G.adj(v)) {
            if (!marked[w]) {
                dfs(G, w);
            }
        }
    }


    public boolean marked(int v) {
        validateVertex(v);
        return marked[v];
    }


    public int count() {
        return count;
    }


    private void validateVertex(int v) {
        int V = marked.length;
        if (v < 0 || v >= V)
            throw new IllegalArgumentException("vertex " + v + " is not between 0 and " + (V-1));
    }


    public static void main(String[] args) {
        In in = new In(args[0]);
        Graph G = new Graph(in);
        int s = Integer.parseInt(args[1]);
        DepthFirstSearch search = new DepthFirstSearch(G, s);
        for (int v = 0; v < G.V(); v++) {
            if (search.marked(v))
                StdOut.print(v + " ");
        }

        StdOut.println();
        if (search.count() != G.V()) StdOut.println("NOT connected");
        else                         StdOut.println("connected");
    }

}

【问题讨论】:

标签: java algorithm undirected-graph


【解决方案1】:

虽然您刚刚发布了部分代码,但我相信w 代表与当前节点v 相邻的每个节点。或者我们可以说w 代表G.adj(v) 中的每个元素,它应该是一个arrayList 或类似的东西。

在此处查看foreach循环语法:How does the Java 'for each' loop work?

更新:

阅读详细代码,虽然没有Graph的定义,但还是确定 回答的应该是合理的。

【讨论】:

  • 我刚刚编辑了代码,我发布了完整的代码,也许这会帮助你弄清楚那是什么。感谢您发送的链接,我会查看更多详细信息。
【解决方案2】:

您示例中的 for 循环是 foreach 循环。 G.adj(v) 很可能会返回一些集合。 W 代表集合中的每个元素。为该集合中的每个元素 W 做一些事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    相关资源
    最近更新 更多