https://www.patest.cn/contests/pat-a-practise/1053
#include<bits/stdc++.h>
using namespace std;
int x[105];
vector<int> v[105];
int n,m,k,g,h,a;
int path[105];
int root[105];
int leaf[105];
void dfs(int p,int s,int w){
for(int i=0;i<v[p].size();++i){
if(s+x[v[p][i]]<k){
path[w]=v[p][i];
dfs(v[p][i],s+x[v[p][i]],w+1);
}
else if(s+x[v[p][i]]==k&&leaf[v[p][i]]==0){
path[w]=v[p][i];
for(int i=0;i<w;++i){
cout<<x[path[i]]<<" ";
}
cout<<x[path[w]]<<endl;
}
}
}
int cmp(int a,int b){
return x[a]>x[b];
}
int main(){
cin>>n>>m>>k;
for(int i=0;i<n;++i){
cin>>x[i];
}
while(m--){
cin>>h>>g;
while(g--){
cin>>a;
v[h].push_back(a);
root[a]=1;
leaf[h]=1;
}
}
// 本题就最后输出比较麻烦。某位大神的做法很赞:
// 方便输出的一点操作:将子节点根据weight来排序,
// 这样遍历到符合要求的路径就可以直接输出!
for(int i=0;i<n;++i)
sort(v[i].begin(),v[i].end(),cmp);
int st;
for(int i=0;i<n;++i){
if(root[i]==0)
st=i;
}
path[0]=st;
dfs(st,x[st],1);
if(n==1&&k==x[0]) //注意特判只有一个节点的情况
cout<<x[0]<<endl;
}
https://www.patest.cn/contests/pat-a-practise/1098 坑题系列之二——插入排序一定是要从第二个数开始调整的,第一个开始就错了。。(为毛