题目描述
链接
给出树的结构和权值,找从根结点到叶子结点的路径上的权值相加之和等于给定目标数的路径,并且从大到小输出路径
分析
- 静态数组建树
- dfs遍历:注意什么地方要回溯状态
- 二维数组排序,基本用vector实现,记住以后写begin和end了!如果用vector的话
bool cmp(vector<int> a, vector<int> b){
int len = min(a.size(),b.size());
for(int i=0;i<len;i++){
if(a[i] == b[i]) continue
}
}
sort(ans.begin(), ans.end(), cmp);
- 当然最后这里还是用了一维数组排序,因为有个点过不了,很奇怪
#include<bits/stdc++.h>
using namespace std;
const int maxn = 105;
struct node{
int w;
vector<int> child;
}nodes[maxn];
bool cmp(int a, int b){
return nodes[a].w > nodes[b].w;
}
int n,m,s,k,id;
int sum;
vector<vector<int> > ans;
vector<int> path;
void dfs(int i){
path.push_back(nodes[i].w);
sum += nodes[i].w;
if(nodes[i].child.size()==0){
if(sum == s){
ans.push_back(path);
}
path.pop_back();
sum -= nodes[i].w;
return;
}
for(int j=0;j<nodes[i].child.size();j++){
dfs(nodes[i].child[j]);
}
path.pop_back();
sum -= nodes[i].w;
}
int main(){
cin>>n>>m>>s;
for(int i=0;i<n;i++){
cin>>nodes[i].w;
}
for(int i=0;i<m;i++){
cin>>id>>k;
for(int j=0;j<k;j++){
int tmp;
cin>>tmp;
nodes[id].child.push_back(tmp);
}
sort(nodes[id].child.begin(), nodes[id].child.end(), cmp);
}
dfs(0);
for(int i=0;i<ans.size();i++){
for(int j=0;j<ans[i].size();j++){
if(j==0) cout<<ans[i][j];
else cout<<" "<<ans[i][j];
}
cout<<endl;
}
}