题目链接:https://www.patest.cn/contests/pat-a-practise/1053
通过map建立树图结构,采用递归调用的方法来实现
#include <cstdio>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
#include <map>
#include <numeric>
using namespace std;
struct Node{
int id;
int wt;
vector<int> childrens;
Node(){}
Node(int _id , int _wt):id(_id), wt(_wt){}
};
bool cmp(const vector<int> &a, const vector<int> &b){
int t=min(a.size() , b.size());
for(int i=0;i<t;i++){
if(a[i]==b[i])continue;
else return a[i]>b[i];
}
return a.size() > b.size();
}
int givenWt;
map<int, Node> tree;
vector< vector<int> >output;
void _search(int id, vector<int> rst){
rst.push_back(tree[id].wt);
if(accumulate(rst.begin() , rst.end() , 0)==givenWt && tree[id].childrens.size()==0 ){
output.push_back(rst);
return;
}
else {
int temp=tree[id].childrens.size();
for(int i=0; i<temp;i++){
vector<int> v(rst);
_search( tree[id].childrens[i] , v );
}
}
}
int main(){
int nodesNum, nonLeaf;
cin>>nodesNum>>nonLeaf>>givenWt;
int wt=0;
for(int i=0;i<nodesNum;i++){
cin>>wt;
tree.insert( make_pair(i , Node(i , wt) ) );
}
for(int i=0;i<nonLeaf;i++){
int id,num;cin>>id>>num;
for(int j=0;j<num;j++){
int t;cin>>t;
tree[id].childrens.push_back(t);
}
}
vector<int> vec;
_search( 0 , vec);
sort(output.begin(), output.end() , cmp);
int t=output.size();
for(int i=0; i<t; i++){
int tt=output[i].size();
for(int j=0;j<tt;j++){
if(j==tt-1)printf("%d",output[i][j]);
else printf("%d ",output[i][j]);
}
if(i<t-1)printf("\n");
}
return 0;
}