【问题标题】:Find the path between a node to another given node in a tree represented by an adjacency list在由邻接表表示的树中找到一个节点到另一个给定节点之间的路径
【发布时间】:2017-07-23 14:26:32
【问题描述】:

在由邻接列表表示的中找到一个节点到另一个给定节点的路径br> 编辑: 该树以 n 个节点的非循环连通图的形式给出,其中节点从 1 到 n
例如,如果当 n = 5 时,树被给出为:
1 4
4 5
3 2
4 2
我应该能够使用算法找到任何 n 个节点之间的路径
我可以用 c++ 和 java 和 python 编程

【问题讨论】:

  • 你希望人们做你的功课吗?编写代码,尽你所能,如果需要具体帮助,请发布确切的问题。

标签: java python c++ tree adjacency-list


【解决方案1】:

您可以通过 BFS 或 DFS 来实现。这将花费 O(N) 时间。但是,如果您想查询 N 个节点中的任意 2 个,则可以使用重轻分解在线完成。

这是一个基于 BFS 的实现。

int n;
cin >> n;
vector <int> graph[n], visited(n);
for (int i = 0; i < n - 1; ++i)
{
    int st, en;
    cin >> st >> en;
    st--;
    en--;
    graph[st].push_back(en);
    graph[en].push_back(st);
}
int st, en;
cin >> st >> en;
st--, en--;
queue  <pair <int, int> > q;
q.push({st, 0});
visited[st] = 1;
while (!q.empty())
{
    auto  top = q.front();
    if (top.first == en)
        return top.second;
    q.pop();
    for (auto & x : graph[top.first])
    {
        if(!visited[x])
        {
            q.push({x, top.second + 1});
            visited[x] = 1;
        }
    }
}

【讨论】:

  • 实际上这不会返回路径,但我对其进行了修改以使其工作。谢谢。我之前使用了类似的 dfs 方法,但它并不适用于所有情况。知道为什么吗?
  • 您可以使用父子节点之间的映射来获取路径。在这里你可以找到我对你的问题的类似解决方案。你能分享问题的链接和你的代码吗? pastebin.com/HuiYsH7t
【解决方案2】:

首先取一个访问过的数组,并为所有节点将其初始化为 0。 将访问数组中的起始节点标记为 1(即已访问)并在此节点上执行基本 DFS。到达所需节点后,立即停止算法。 文件系统: http://www.geeksforgeeks.org/depth-first-traversal-for-a-graph/

【讨论】:

    【解决方案3】:

    您应该查找 dijkstra 的A* 寻路算法,如果您的数据可以被操纵,它们会为您解决这个问题。

    dijkstra's 是我最喜欢的,简单易懂。但效率不如 A*
    https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

    如果不知道您的数据是如何存储的、您使用的是什么编程语言或图形软件,无法真正给出更有用的答案,请添加标签并在您的问题中更具描述性。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-04
      • 2011-04-27
      • 1970-01-01
      相关资源
      最近更新 更多