!: DFS,树的表示
#include<iostream>
#include<algorithm>
#include<vector>
#include<stdlib.h>
using namespace std;
const int maxn = 110;
struct node
{
int w;
vector<int> child;
}Node[maxn];
int n, m, s;
int path[maxn];
bool cmp(int a, int b)
{
return Node[a].w > Node[b].w; // cmp这里很关键;
}
//当前访问的节点序号, 该路径上的节点数目, 已走过部分路径的权重
void dfs(int index, int numNode, int sum)
{
if(sum > s) return;
if(sum == s)
{
if(Node[index].child.size() != 0) return; //判断当前访问节点是否是叶子结点;
for(int i = 0; i < numNode; i++)
{
cout << Node[path[i]].w;
if(i == numNode -1) cout << endl;
else cout << " ";
}
}
for(int i = 0; i < Node[index].child.size(); i++)
{
int child = Node[index].child[i];
path[numNode] = child;
dfs(child, numNode + 1, sum + Node[child].w );
}
}
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 now, num, loc;
cin >> now >> num;
for(int j = 0; j < num; j++)
{
cin >> loc;
Node[now].child.push_back(loc);
}
sort(Node[now].child.begin(), Node[now].child.end(), cmp);
}
path[0] = 0;
dfs(0, 1, Node[0].w);
system("pause");
return 0;
}