DepthFirstSearch java 实现
DepthFirstSearch java implementation
我正在尝试学习如何将图形(深度优先搜索)实现到 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");
}
}
您示例中的 for 循环是 foreach
循环。 G.adj(v)
最有可能 returns 一些 collection。 W
表示 collection 中的每个元素。对于 collection 中的每个元素 W
做一些事情。
虽然您只是发布了部分代码,但我相信 w
代表与当前节点 v
相邻的每个节点。或者我们可以说 w
代表 G.adj(v)
中的每个元素,它应该是一个 arrayList 或类似的东西。
参见foreach
循环语法:How does the Java 'for each' loop work?
更新:
阅读详细代码,虽然缺少Graph
的定义,但还是确定
回答的应该是合理的。
我正在尝试学习如何将图形(深度优先搜索)实现到 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");
}
}
您示例中的 for 循环是 foreach
循环。 G.adj(v)
最有可能 returns 一些 collection。 W
表示 collection 中的每个元素。对于 collection 中的每个元素 W
做一些事情。
虽然您只是发布了部分代码,但我相信 w
代表与当前节点 v
相邻的每个节点。或者我们可以说 w
代表 G.adj(v)
中的每个元素,它应该是一个 arrayList 或类似的东西。
参见foreach
循环语法:How does the Java 'for each' loop work?
更新:
阅读详细代码,虽然缺少Graph
的定义,但还是确定
回答的应该是合理的。