总结:
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;
}