打印从根到树的每一片叶子的路径的最优化方法是什么?

时间:2019-04-12 20:48:57

标签: graph tree root breadth-first-search

输入

  

T-测试用例

     

无节点数

     

跟随N-1行

     

x y-x和y之间有一条边

1
5
1 2
2 5
1 3
3 4

输出

Path 1 3 4
Path 1 2 5 

方法

  

首先,我在树上执行BFS,并为每个存储所有父值   然后,对于每个叶节点,我使用   父值。我将它们推到路径向量并打印路径向量。   但是,我认为解决方案的时间效率很低。你是否可以   提出更好的方法?

我的代码-它正在获得标题

void bfs(vector<int> adj[], int start, int n, int val[], int mod[]) {

    int parent[n + 1];
    bool visited[n + 1];
    memset(visited, false, sizeof(visited));
    for (int i = 1; i <= n; ++i)
    {
        /* code */
        parent[i] = -1;
    }



    queue<int> q;
    q.push(start);
    parent[start] = -1;
    visited[start] = true;
    while (!q.empty()) {
        int x;
        x = q.front();
        q.pop();

        for (auto u : adj[x]) {
            if (!visited[u]) {
                q.push(u);
                parent[u] = x;
                visited[u] = true;
            }

        }



    }

    vector<int> leaf;
    //check if a leaf node
    for (int i = 1; i <= n; i++) {
        if (adj[i].size() == 1)
            leaf.pb(i);

    }


    for (auto x : leaf) {
        vector<int> path;
        for (int v = x; v != -1; v = parent[v])
            path.push_back(val[v]);
        cout<<"Path"<<" ";
        for(auto x:path)
           cout<<x<<" ";
        cout<<endl;

    }



}

int main(){
int t;
    cin >> t;

    while (t--) {
        int n;
        cin >> n;

        std::vector<int> adj[n + 1];
        int edges = n - 1;
        while (edges--) {
            int x, y;
            cin >> x >> y;
            adj[x].pb(y);
            adj[y].pb(x);
        }

        int val[n + 1];
        int mod[n + 1];

        for (int i = 1; i <= n; i++) {
            /* code */
            cin >> val[i];
        }
        for (int i = 1; i <= n; i++) {
            /* code */
            cin >> mod[i];
        }



        bfs(adj, 1, n, val, mod);
        cout<<endl;
      return 0;
     }

0 个答案:

没有答案