二叉树的静态实现。
深度优先遍历,在每一个多叉点,逐个进入下层递归,return时要注意还原一步,到初始状态
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
struct node{
int weight;
vector<int> child;
} tree[100];
int N, M, S;
vector<int> path;
bool cmp(int a, int b);
void DFS(int index, int sum);
int main(){
scanf("%d%d%d", &N, &M, &S);
for(int i=0; i<N; i++) scanf("%d", &tree[i].weight);
while(M--){
int n, ct, ch;
scanf("%d%d", &n, &ct);
while(ct--){
scanf("%d", &ch);
tree[n].child.push_back(ch);
}
//子结点按权重从大到小排,即可满足序列输出顺序的要求
sort(tree[n].child.begin(), tree[n].child.end(), cmp);
}
path.push_back(tree[0].weight);
DFS(0, tree[0].weight);
return 0;
}
bool cmp(int a, int b){
return tree[a].weight>tree[b].weight;
}
//深度遍历到index结点,至此积累了sum的权重
void DFS(int index, int sum){
if(tree[index].child.size()==0){
if(sum==S){
int c = path.size();
for(int i=0; i<c; i++){
printf("%d", path[i]);
if(i<c-1) printf(" ");
}
printf("\n");
return;
}
else return;
}
else{
if(sum>=S) return; //剪枝,如果内部结点处sum已到达阈值,直接返回
else{
int ch_c = tree[index].child.size();
for(int i=0; i<ch_c; i++){
int t = tree[index].child[i];
int w = tree[t].weight;
path.push_back(w);
DFS(t, sum+w);
path.pop_back(); //退回到初始状态,走另外几条路
}
}
}
return;
}