题目
题目描述
解题思路
- 1.dfs遍历就行了,重点是要设置出一种结构,方便你进行遍历。
例如我这里结构如下:
struct node
{
int value, father, sum;
bool visited,isLeaf;
vector<int> children;
node() :value(-1),father(-1),sum(0),visited(false),isLeaf(true){}
};
其中father是为了方便输出用的,sum和visited也让程序变得更方便。 - 2.输入要求值从大到小输出,所以我这里遍历的时候就从大到小遍历,详细请看代码。
代码
#include<iostream>
#include<vector>
#include<deque>
#include<algorithm>
using namespace std;
int n, m, s;
struct node
{
int value, father, sum;
bool visited,isLeaf;
vector<int> children;
node() :value(-1),father(-1),sum(0),visited(false),isLeaf(true){}
};
vector<node> a;
bool cmp(int k1, int k2)
{
return a[k1].value > a[k2].value;
}
void prin(int k)
{
vector<int> b;
b.push_back(k);
int father = a[k].father;
while (father!=-1)
{
b.push_back(father);
father = a[father].father;
}
int k1 = (int)(b.size()-1);
bool flag = false;
for (; k1>=0; k1--)
{
if (!flag)
{
cout << a[b[k1]].value;
flag = true;
}
else
cout << " " << a[b[k1]].value;
}
}
void dfs(int k)
{
a[k].visited = true;
if (k == 0) a[k].sum = a[k].value;
else
a[k].sum = a[a[k].father].sum + a[k].value;
if (a[k].isLeaf)
{
if (a[k].sum == s)
{
prin(k);
cout << endl;
}
return;
}
else
{
for (int i = 0; i < (int)a[k].children.size(); i++)
{
int children_id = a[k].children[i];
if (!a[children_id].visited)
dfs(children_id);
}
}
}
int main()
{
cin >> n >> m >> s;
a.resize(n);
for (int i = 0; i < n; i++)
cin >> a[i].value;
int tem_id, tem_numOfChild;
for (int i = 0; i < m; i++)
{
cin >> tem_id >> tem_numOfChild;
a[tem_id].children = vector<int>(tem_numOfChild);
a[tem_id].isLeaf = false;
for (int i = 0; i < tem_numOfChild; i++)
{
cin >> a[tem_id].children[i];
a[a[tem_id].children[i]].father = tem_id;
}
sort(a[tem_id].children.begin(), a[tem_id].children.end(), cmp);
}
dfs(0);
return 0;
}