题目描述:
1053 Path of Equal Weight (30 分)
Given a non-empty tree with root R, and with weight Wi assigned to each tree node Ti. The weight of a path from R to L is defined to be the sum of the weights of all the nodes along the path from R to any leaf node L.
Now given any weighted tree, you are supposed to find all the paths with their weights equal to a given number. For example, let’s consider the tree showed in the following figure: for each node, the upper number is the node ID which is a two-digit number, and the lower number is the weight of that node. Suppose that the given number is 24, then there exists 4 different paths which have the same given weight: {10 5 2 7}, {10 4 10}, {10 3 3 6 2} and {10 3 3 6 2}, which correspond to the red edges in the figure.
(……)
#include<iostream>
#include<fstream>
#include<queue>
#include<vector>
#include<algorithm>
#define MAX 100
using namespace std;
int n, m, s;
struct Node{
int w;
vector<int> chlds;
};
Node tree[MAX];
bool cmp(int a, int b) {
return tree[a].w > tree[b].w;
}
void DFS(int root, int sum, vector<int> path){
path.push_back(root);
for(int i=0; i<tree[root].chlds.size(); i++) {
if(sum+tree[tree[root].chlds[i]].w<s) {
// path.push_back(tree[root].chlds[i]);
DFS(tree[root].chlds[i], sum+tree[tree[root].chlds[i]].w, path);
}
else if(sum+tree[tree[root].chlds[i]].w==s && tree[tree[root].chlds[i]].chlds.empty()== true) {
for(int j=0; j<path.size(); j++) {
cout<<tree[path[j]].w<<' ';
}
cout<<tree[tree[root].chlds[i]].w<<endl;
// return;
}
}
path.pop_back();
}
int cnt=0;
int main() {
// fstream fin;
// fin.open("tmp.txt");
// fin>>n>>m>>s;
// for(int i=0;i<n;i++) {
// fin>>tree[i].w;
// }
cin>>n>>m>>s;
for(int i=0;i<n;i++) {
cin>>tree[i].w;
}
for (int i = 0; i < m; ++i) {
int id, k;
// fin>>id>>k;
cin>>id>>k;
for(int j=0;j<k;j++) {
int chld;
// fin>>chld;
cin>>chld;
tree[id].chlds.push_back(chld);
}
sort(tree[id].chlds.begin(), tree[id].chlds.end(), cmp);
}
vector<int> path;
int sum = tree[0].w;
// 可能忽略的特殊点:只有根节点,根节点权值=s的情况
if(n==1&&sum==s)
cout<<s;
else
DFS(0, sum,path);
}
容易忽略的特殊测试点:只有根节点,根节点权值=s的情况