从起点开始的深度优先算法

时间:2015-04-27 15:47:13

标签: java algorithm arraylist graph-theory depth-first-search

好的,我在网上看了很多,并没有真正点击我。

我有一个ArrayList towns = new ArrayList<Town>,其中包含我将要执行DFS的城镇。

我用~8个城镇填充这个数组

我有一个整数int i(ArrayList中的城镇索引,其中 是路径中的第一个)

我有一个初始距离double dist = 0

我有一个函数distBetween(Town a, Town b)可以完成它所说的。

我有一个Arraylist route = new ArrayList<Town>(),其中包含城镇的顺序,具体取决于我正在采取的路径。

现在我有执行深度优先搜索的主要功能(递归,根据在线研究)。

public static void dfs(){

    // what goes here

}

我需要在路径数组中添加城镇,并根据深度优先搜索算法将其删除。我也需要编辑dist变量。

我怎么能得到这个。有人可能会给我提供一些伪代码或评论,只是解释要做什么。我似乎无法应用我在网上找到的其他算法。如果我能得到一个特定于我的情况的解释那将是伟大的。

如果能够更轻松地执行搜索,我可以从i删除索引town

2 个答案:

答案 0 :(得分:1)

DFS算法

  1. 输入图形的顶点和边缘G =(V,E)。
  2. 输入源顶点并将其分配给变量S.
  3. 将源顶点推送到堆栈。
  4. 重复步骤5和6,直到堆栈为空。
  5. 弹出堆栈的顶部元素并显示它。
  6. 如果它不在队列中并且显示(即没有访问过),则推送刚刚弹出元素的邻居顶点。
  7. 退出。
  8. 要存储顶点和边缘,您需要adjacency matrix

答案 1 :(得分:1)

我假设您有一个State类,其中包含以下属性(如果您喜欢图表,请使用Node代替State):

Set<Town> unused;        // towns not yet visited
ArrayList<Town> path;    // current path
double dist;             // total distance in path

然后使用像这样的代码以递归方式尝试使用DFS的每个可能的路径。在第一次通话时,请使用dfs(emptyState, startTown, null)

public static void dfs(State s, Town last, State best) {
    s.path.add(last);
    s.unused.remove(last);
    if (unused.empty()) {
        // all towns visited - distance and path are now complete
        if (best == null || s.dist < best.dist) best = s;
        return;
    }
    for (Town t : s.unused) {
        State next = s.copy(); // a copy of State s
        next.dist += distBetween(last, t);
        dfs(next, t);
    }
}

调用此函数后,所有路径都将被访问一次(以DFS顺序),best将包含最短路径。请注意,对于许多城市而言,这变得非常缓慢 - O(n!)。