【问题标题】:Pathfinding with cycles in a graph (Use each edge once)在图中使用循环进行寻路(使用每条边一次)
【发布时间】:2013-10-29 15:19:45
【问题描述】:

我想在图表中搜索一些路径。图表有循环,它们经常发生。

把画房子的老谜语带回来,不提笔画同一边2次。

  ^
 / \
/ _ \
|\ /|
| x |
|/_\|

它有 5 个顶点和 8 个边。假设我想检查是否可以在给定起始顶点的情况下在不“举起笔”的情况下绘制这样的图形。请注意,我可以(并且可能需要)处理具有不同地图状态的相同顶点(是否使用周围的边缘?)几次。在运行 BFS/DFS 时,我是否必须为每个节点制作整个边缘使用数组的副本?有什么简单的方法可以做到吗?

【问题讨论】:

  • 一个随机的事实 - 如果存在任何这样的顶点,路径将始终在具有奇数边的顶点开始和结束。
  • 我想知道路径。
  • 不知道 bfs/dfs 有什么问题。
  • DFS 或 BFS 将访问每个节点一次。您需要访问所有边缘,而不是节点。这将需要多次访问单个顶点。

标签: java algorithm graph path-finding


【解决方案1】:

对于 DFS,您只需要在边缘访问过标志。无需复制,调用后重置即可。

伪代码:

for each node
  for each edge
    edge.visited = false
  dfs(node)

dfs(node)
  // do something with node?
  // perhaps check numberOfEdges == visited.size() to see if we're done
  for each edge in node
    if (!edge.visited)
      edge.visited = true
      dfs(edge.other(node))
      edge.visited = false

【讨论】:

  • 哦...看起来很合法。有什么办法可以这样改善 BFS?
  • @kittyPL 使用 BFS,每个路径都必须跟踪它自己的一组已访问标志,您必须在检查邻居时检查这些标志,并为每个路径复制它。
  • 由于 DFS 令人满意,我不会费心以迭代的方式进行 :) 谢谢,现在接受答案 :)
【解决方案2】:

假设我想检查是否可以在给定起始顶点的情况下不“举起笔”来绘制这样的图形。

如果图表没有连接,则无法绘制。否则,如果图形没有奇数degree 的顶点,则无论您从哪个顶点开始,都有可能。如果它有两个这样的顶点,那么当且仅当给定顶点的度数为奇数时才有可能。如果它有两个以上的奇度顶点,那是不可能的。

我想在图中搜索一些路径。

如果可以绘制(见上文),只要剩余的边相连,任何路径都可以。

【讨论】:

  • 我想知道所有满足我需求的路径。你刚刚给出了我以前知道的真/假解决方案。
  • @kittyPL 好吧,很抱歉,虽然从你的问题中看不出来。
  • 没问题。实际上,“让我们说”是一个非常重要的部分。尽管我以谜语为例(算法完全相同),但我需要它来完成完全不同的任务。
猜你喜欢
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 2015-05-03
相关资源
最近更新 更多