代码之家  ›  专栏  ›  技术社区  ›  jah

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

  •  -3
  • jah  · 技术社区  · 7 年前

    由一个
    编辑:
    例如,当n=5时,树为:

    4 5
    3 2
    4 2

    3 回复  |  直到 7 年前
        1
  •  0
  •   Dhruv Sehgal    7 年前

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

    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;
            }
        }
    }
    
        2
  •  0
  •   Ashish Jain    7 年前

    首先获取一个已访问的数组,并为所有节点将其初始化为0。 http://www.geeksforgeeks.org/depth-first-traversal-for-a-graph/

        3
  •  -1
  •   Zac    7 年前

    你应该抬头看看 dijkstra的

    dijkstra的
    https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

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

    希望这有帮助。