Java 在由邻接列表表示的树中,查找一个节点到另一个给定节点之间的路径

Java 在由邻接列表表示的树中,查找一个节点到另一个给定节点之间的路径,java,python,c++,tree,adjacency-list,Java,Python,C++,Tree,Adjacency List,在由邻接列表表示的树中查找一个节点到另一个给定节点之间的路径 编辑: 树以n个节点的无环连通图的形式给出,其中节点从1到n 例如,当n=5时,树的形式为: 14 4.5 3.2 4.2 我应该能够使用该算法找到n个节点之间的路径 我可以用C++和java和python < /p> < p>编程,你应该查一下 dijkstra的 >和>强*>强/路径查找算法,如果你的数据可以被操纵,他们会为你解决这个问题。 迪克斯特拉的是我最喜欢的,简单易懂。但效率不如A* 如果不知道您的数据是如何存储的,您使

在由邻接列表表示的树中查找一个节点到另一个给定节点之间的路径 编辑: 树以n个节点的无环连通图的形式给出,其中节点从1到n
例如,当n=5时,树的形式为:
14
4.5
3.2
4.2
我应该能够使用该算法找到n个节点之间的路径

我可以用C++和java和python < /p> < p>编程,你应该查一下<强> dijkstra的<强> >和>强*>强/路径查找算法,如果你的数据可以被操纵,他们会为你解决这个问题。 迪克斯特拉的
是我最喜欢的,简单易懂。但效率不如A*

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


希望这能有所帮助。

首先获取一个已访问的数组,并为所有节点将其初始化为0。 将已访问阵列中的开始节点标记为1(即已访问),并在此节点上执行基本DFS。到达所需节点后,立即停止算法。 DFS:
您可以通过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;
        }
    }
}
intn;
cin>>n;
向量图[n],访问(n);
对于(int i=0;i>st>>en;
圣--;
嗯--;
图[st]。推回(en);
图[en]。推回(st);
}
int-st,en;
cin>>st>>en;
圣--,恩--;
队列q;
q、 推送({st,0});
到访[st]=1;
而(!q.empty())
{
自动顶部=q.前部();
if(top.first==en)
返回顶部。秒;
q、 pop();
对于(自动&x:graph[顶部第一])
{
如果(!已访问[x])
{
q、 推动({x,top.second+1});
访问量[x]=1;
}
}
}

实际上,这不会返回路径,但我修改了它使其工作。谢谢。早些时候我使用了类似的dfs方法,但并不适用于所有情况。知道为什么吗?您可以使用父节点和子节点之间的映射来获取路径。在这里你可以找到我对你的问题的类似解决方案。你能分享问题的链接和你的代码吗。你希望别人帮你做作业吗?编写代码,尽你所能,如果你需要具体的帮助,发布确切的问题。