1. 程式人生 > >PAT 1053. Path of Equal Weight (30)

PAT 1053. Path of Equal Weight (30)

file ati 一個數 ges ... ase tle des 作者

1053. Path of Equal Weight (30)

時間限制 100 ms 內存限制 65536 kB 代碼長度限制 16000 B 判題程序 Standard 作者 CHEN, Yue

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 Lis 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.

技術分享圖片
Figure 1

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 = Bifor 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

深度遍歷dfs,dfs函數分兩部分,第一部分寫達到某些條件進行返回,第二部分寫遍歷下一個節點。

這道題在順序輸出上有兩個思路,一個是在children中添加子節點時,進行排序,使得在遍歷過程中實現順序遍歷;另一個是將遍歷後符合條件的結果放入一個數組中,最後在對數組排序,但是第二種方法,我在PAT上運行程序,有一個case顯示段錯誤,在牛客網上卻是正確的,我很詫異,可能是vector數組sort的問題?我不確定。

#include <bits/stdc++.h>

using namespace std;

int N, M, K;

struct Node {
    int weight;
    vector<int> children;
}nodes[102];

bool cmp(int a, int b) {
    return nodes[a].weight > nodes[b].weight;
}

bool cmp2(vector<int> vec1, vector<int>vec2) {
    int len1 = vec1.size();
    int len2 = vec2.size();
    int len = min(len1, len2);
    for(int i = 0; i < len; i++) {
        if(nodes[vec1[i]].weight < nodes[vec2[i]].weight) {
            return false;
        }
        else if(nodes[vec1[i]].weight > nodes[vec2[i]].weight) {
            return true;
        }
    }
    return true;
}

vector<int> nodesVec;
//vector<int> nodesVecs[102];
//int INDEX = 0;

void dfs(int index, int weights) {
    //cout<< "index:"<< index<< endl;
    if(weights > K) {
        return;
    }
    if(nodes[index].children.size() == 0) {
        if(weights == K) {
            //nodesVecs[INDEX] = nodesVec;
            //INDEX++;
            for(int i = 0; i < nodesVec.size(); i++) {
                if(i != 0) cout<< " ";
                cout<< nodes[nodesVec[i]].weight;
            }
            cout<< endl;
        }
        return;
    }
    for(int i = 0; i < nodes[index].children.size(); i++) {
        nodesVec.push_back(nodes[index].children[i]);
        dfs(nodes[index].children[i], weights+nodes[nodes[index].children[i]].weight);
        nodesVec.erase(nodesVec.end()-1);
    }
}

int main()
{
    cin>>N>>M>>K;
    for(int i = 0; i < N; i++) {
        cin>> nodes[i].weight;
    }
    int index, s, c;
    for(int i = 0; i < M; i++) {
        cin>> index>> s;
        for(int j = 0; j < s; j++) {
            cin>> c;
            nodes[index].children.push_back(c);
        }
        sort(nodes[index].children.begin(), nodes[index].children.end(), cmp);
    }
    nodesVec.push_back(0);
    dfs(0, nodes[0].weight);
    /*
    sort(nodesVecs, nodesVecs+INDEX, cmp2);
    for(int i = 0; i < INDEX; i++) {
        for(int j = 0; j < nodesVecs[i].size(); j++) {
            if(j != 0) cout<< " ";
            cout<< nodes[nodesVecs[i][j]].weight;
        }
        cout<< endl;
    }*/
    return 0;
}

PAT 1053. Path of Equal Weight (30)