美文网首页
PAT1053 Path of Equal Weight (30

PAT1053 Path of Equal Weight (30

作者: yestinl | 来源:发表于2018-11-15 23:44 被阅读0次

    题目

    Given a non-empty tree with root R, and with weight Wi assigned to each tree node Ti. The weight of a path from R to L is defined to be the sum of the weights of all the nodes along the path from R to any leaf node L.

    Now given any weighted tree, you are supposed to find all the paths with their weights equal to a given number. For example, let’s consider the tree showed in Figure 1: for each node, the upper number is the node ID which is a two-digit number, and the lower number is the weight of that node. Suppose that the given number is 24, then there exists 4 different paths which have the same given weight: {10 5 2 7}, {10 4 10}, {10 3 3 6 2} and {10 3 3 6 2}, which correspond to the red edges in Figure 1.

    image.png

    Input Specification: Each input file contains one test case. Each case starts with a line containing 0 < N <= 100, the number of nodes in a tree, M (< N), the number of non-leaf nodes, and 0 < S < 230, the given weight number. The next line contains N positive numbers where Wi (<1000) corresponds to the tree node Ti. Then M lines follow, each in the format:

    ID K ID[1] ID[2] … ID[K]
    where ID is a two-digit number representing a given non-leaf node, K is the number of its children, followed by a sequence of two-digit ID’s of its children. For the sake of simplicity, let us fix the root ID to be 00.

    Output Specification:

    For each test case, print all the paths with weight S in non-increasing order. Each path occupies a line with printed weights from the root to the leaf in order. All the numbers must be separated by a space with no extra space at the end of the line.

    Note: sequence {A1, A2, …, An} is said to be greater than sequence {B1, B2, …, Bm} if there exists 1 <= k < min{n, m} such that Ai = Bi for i=1, … k, and Ak+1 > Bk+1.

    Sample Input:
    20 9 24
    10 2 4 3 5 10 2 18 9 7 2 2 1 3 12 1 8 6 2 2
    00 4 01 02 03 04
    02 1 05
    04 2 06 07
    03 3 11 12 13
    06 1 09
    07 2 08 10
    16 1 15
    13 3 14 16 17
    17 2 18 19
    Sample Output:
    10 5 2 7
    10 4 10
    10 3 3 6 2
    10 3 3 6 2

    分析

    题目大意:输入一个有N个带权重节点,M个非叶子节点的树,给定一个S,求路径从根节点到叶子节点权重加起来等于S的所有路径,并按字典序降序输出。
    思路:用结构体数组建立数据结构,并且在建立时对每个子节点按权重大小重新排序。dfs遍历的时候用数组path对路径进行跟踪,最后就直接输出path中0:childNode-1的权重。

    代码

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <queue>
    using namespace std;
    struct node{
        int w;
        int child_num;
        vector<int> child;
    };
    vector<int> path;
    vector<node> tree;
    int N, M, S;
    void dfs(int r, int sum_w, int childNode)
    {
        if(sum_w > S)
            return;
        if(sum_w == S)
        {
            if(tree[r].child_num != 0)
                return;
            for(int j = 0; j<childNode; j++)
            {
                cout << tree[path[j]].w;
                if(j != childNode-1)
                    cout << " ";
                else
                    cout << endl;
            }
        }
        for(int i = 0; i<tree[r].child_num; i++)
        {
            path[childNode] = tree[r].child[i];
            dfs(tree[r].child[i], sum_w+tree[tree[r].child[i]].w, childNode+1);
        }
    }
    
    int cmp(int a, int b)
    {
        return tree[a].w > tree[b].w;
    }
    
    int main()
    {
    
        cin >> N >> M >> S;
        tree.resize(N);
        path.resize(N);
        for(int i = 0; i<N; i++)
        {
            cin >> tree[i].w;
        }
        for(int i = 0; i<M; i++)
        {
            int ID;
            cin >> ID;
            cin >> tree[ID].child_num;
            tree[ID].child.resize(tree[ID].child_num);
            for(int j = 0; j<tree[ID].child_num; j++)
            {
                cin >> tree[ID].child[j];
            }
            sort(tree[ID].child.begin(), tree[ID].child.end(), cmp);
        }
    //    for(int i = 0; i<N; i++)
    //    {
    //        cout << i << " " << tree[i].w << " " << tree[i].child_num << " ";
    //        for(int j = 0; j<tree[i].child_num; j++)
    //            cout << tree[i].child[j] << " ";
    //        cout << endl;
    //    }
        dfs(0, tree[0].w, 1);
        return 0;
    }
    

    总结

    柳神的代码
    学会如何在遍历树的时候对同一路径进行跟踪
    利用sort,实现树按某一属性(权重)重新排序

    相关文章

      网友评论

          本文标题:PAT1053 Path of Equal Weight (30

          本文链接:https://www.haomeiwen.com/subject/zmtpfqtx.html