好的,我在网上看了很多,并没有真正点击我。
我有一个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
。
答案 0 :(得分:1)
DFS算法
要存储顶点和边缘,您需要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!)。