思路:
常规的一颗树搭配常规的遍历,但是难点在于如何实现对于符合题目要求的数据,先输出字典序大的
我采用的方法是每读入一个非叶结点,对于其孩子结点根据其重量的大小递减排序,这样dfs遍历的时候可以保证字典序大的一定会被优先遍历到
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct node{
int w;
vector<int> child;//孩子结点下标
}Node[105];
//dfs从重量大的值开始遍历,所以最早输出肯定是字典序偏大的
bool cmp(int a,int b)//根据重量从大到小排序
{
return Node[a].w>Node[b].w;
}
int n,m,s;
vector<int> result;//存储最后结果
vector<int> h(100,1);//0表示不是叶子结点
void dfs(int cursum,int index)
{
if(h[index]==1&&cursum==s)//遍历到了叶子结点
{
for(int i=0;i<result.size();i++)
{
cout<<result[i];
if(i!=result.size()-1)cout<<" ";
else cout<<endl;
}
return;
}
for(int i=0;i<Node[index].child.size();i++)
{
result.push_back(Node[Node[index].child[i]].w);
dfs(cursum+Node[Node[index].child[i]].w,Node[index].child[i]);
result.pop_back();
}
}
int main()
{
cin>>n>>m>>s;
for(int i=0;i<n;i++)cin>>Node[i].w;
for(int i=0;i<m;i++)
{
int rot,k,temp;
cin>>rot>>k;
h[rot]=0;
while(k--)
{
cin>>temp;
Node[rot].child.push_back(temp);
}
sort(Node[rot].child.begin(),Node[rot].child.end(),cmp);
}
result.push_back(Node[0].w);
dfs(Node[0].w,0);
return 0;
}