PAT A1053 Path of Equal Weight(30 分)-----树---dfs必看经典题目(attetion)

总结:

1.这道题不难,但是是我在pat中遇到的关于树遍历题目相对比较复杂的题目之一了,给我的感觉和图相似,当然图更难。这道题有权,还要求规定sum的路径,还不止一条。

2.我的解决办法是用dfs加了sum(从根到叶权之和,以及一个vector参数,用来记录从根到叶都经过了哪些节点),用了map来记录不同sum的路径

3.sort()自定义排序过程中遇到了一个问题:[C++] Expression : invalid operator <

百度了下发现:sort函数:当a=b的时候应该返回false,如果你返回了true就会出现该错误,注意一下就好了

代码:

#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
struct node{
    int wi;
    vector<int> p;
};
int n, m, s;
int sum = 0;
vector<node> pp;
map<int, vector<vector<int> > > uu;
bool cmp(vector<int>a,vector<int>b)
{
    bool flag =false;
    for (int i = 0; i < a.size() && i < b.size();)
    {
        if(a[i]!=b[i])return a[i]>b[i];
        else i++;
    }
    return flag;
}
bool cmp2(int a,int b)
{
    return a>b;
}
void dfs(int index,int high,int sum,vector<int> gg)
{
    if (pp[index].p.size() != 0)
    {
        for (int i = 0; i < pp[index].p.size(); i++)
        {
            gg.push_back(pp[index].wi);
            dfs(pp[index].p[i], high + 1, sum + pp[index].wi,gg);
            gg.pop_back();
        }
    }
    else{
        sum += pp[index].wi; gg.push_back(pp[index].wi);
        //sort(gg.begin(),gg.end(),cmp2);
        uu[sum].push_back(gg);
    }
}
int main()
{
    cin >> n >> m >> s;
    pp.resize(n);
    for (int i = 0; i < n; i++)
        cin >> pp[i].wi;
    for (int i = 0; i < m; i++)
    {
        int id, num;
        cin >> id >> num;
        for (int j = 0; j < num; j++)
        {
            int sk;
            cin >> sk;
            pp[id].p.push_back(sk);
        }
    }
    vector<int> gg;
    dfs(0, 0,0,gg);
    sort(uu[s].begin(),uu[s].end(),cmp);
    for (int i = 0; i < uu[s].size(); i++){
        for (int j = 0; j < uu[s][i].size(); j++)
        {
            cout << uu[s][i][j];
            if (j != uu[s][i].size() - 1)cout << " ";
        }
        if(i!=uu[s].size()-1)cout << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/luoshiyong123/article/details/82018192