版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Xiblade/article/details/83187923
此题有较大的玄学,如果将cmp函数的默认返回值更改为true,则会出现最后一个测试用例的“段错误”。
在代码中以“我的天!!!玄学”标识出
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
struct Node{
int weight;
vector<int> child;
};
Node t[1010];
vector<vector<int> > serialStore;
vector<int> tmpSerial;
bool cmp(vector<int> a, vector<int> b){
if(a.empty() || b.empty()){
return a.empty();
}
int minL = min(a.size(), b.size());
for(int i = 0; i < minL; i++){
if(a[i] != b[i]) return a[i] > b[i]; // 关键在这里的大于号
}
return false; // 我的天!!玄学
}
// 测试cmp是否工作的函数
void sortSerial(){
vector<int> tmp;
tmp.push_back(10);tmp.push_back(3);tmp.push_back(3);tmp.push_back(6);tmp.push_back(2);
serialStore.push_back(tmp);
tmp.clear();
tmp.push_back(10);tmp.push_back(5);tmp.push_back(2);tmp.push_back(7);
serialStore.push_back(tmp);
tmp.clear();
tmp.push_back(10);tmp.push_back(4);tmp.push_back(10);
serialStore.push_back(tmp);
tmp.clear();
tmp.push_back(10);tmp.push_back(3);tmp.push_back(3);tmp.push_back(6);tmp.push_back(2);
serialStore.push_back(tmp);
tmp.clear();
sort(serialStore.begin(), serialStore.begin() + 4, cmp);
while(!serialStore.empty()){
vector<int> v = serialStore.front();
while(!v.empty()){
printf("%d ", v.front());
v.erase(v.begin(), v.begin() + 1);
}
serialStore.erase(serialStore.begin(), serialStore.begin() + 1);
printf("\n");
}
}
int N, M, S;
// N: 节点个数, M: 非叶节点个数, S: 给定权值
void printLayer(int num){
printf("%02d", num); // 不足两位,以0补齐
}
void preOrder(int root){
// printLayer(root);
// printf(" %d %d\n", t[root].weight, nowLayer);
// 访问节点的逻辑应该就是:将节点的权值加入临时序列存储
tmpSerial.push_back(t[root].weight);
if(!t[root].child.empty()){
for(int i = 0; i < t[root].child.size(); i++){
preOrder(t[root].child[i]);
}
} else{ // 叶子节点的逻辑
// 到达叶子节点之后 先计算加和
int sum = 0;
for(int i = 0; i < tmpSerial.size(); i++){
sum += tmpSerial[i];
}
if(sum == S){
serialStore.push_back(tmpSerial);
}
}
tmpSerial.pop_back();
}
int main(){
scanf("%d %d %d", &N, &M, &S);
for(int i = 0; i < N; i++){
scanf("%d", &(t[i].weight));
}
int nodeIdx, childNum;
int tmpWeight;
while(scanf("%d %d", &nodeIdx, &childNum) != EOF){
while(childNum --){
scanf("%d", &tmpWeight);
t[nodeIdx].child.push_back(tmpWeight);
}
}
// 尝试先根遍历整棵树
preOrder(0);
// sortSerial();
if(serialStore.size() > 1)
sort(serialStore.begin(), serialStore.begin() + serialStore.size(), cmp);
while(!serialStore.empty()){
vector<int> v = serialStore.front();
while(!v.empty()){
printf("%d", v.front());
v.erase(v.begin());
if(!v.empty())
printf(" ");
}
serialStore.erase(serialStore.begin());
if(!serialStore.empty())
printf("\n");
}
return 0;
}