版权声明:本文为博主原创文章,欢迎交流学习,未经博主允许不得转载。 https://blog.csdn.net/qq_43749739/article/details/89856844
注:备战2020ing…暂时没时间注解啦,大家凑合先看下代码叭,肥宅对不住了。
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
vector< vector<int> > Ans;
vector<int > path;
typedef struct
{
int w;
vector<int> child;
}node;
int cmp( vector<int > a, vector<int > b )
{
for( auto i = a.begin(), j = b.begin(); i != a.end() && j != b.end(); ++i, ++j )
if( *i != *j )
return *i > *j;
return a.size() - b.size();
}
void DFS( node T[], int i, int K, int sumW )
{
if( T[i].w + sumW <= K )
{
path.push_back(T[i].w);
sumW += T[i].w;
if( !T[i].child.size() && sumW == K )
Ans.push_back(path);
for(int j = 0; j < T[i].child.size(); ++j)
DFS( T, T[i].child[j], K, sumW );
path.pop_back();
}
}
int main()
{
int N, M, K, R, nC, C, sumW = 0, index;
scanf("%d %d %d", &N, &M, &K);
node T[N];
for(int i = 0; i < N; ++i)
scanf("%d", &T[i].w);
for(int i = 0; i < M; ++i)
{
scanf("%d %d", &R, &nC);
for(int j = 0; j < nC; ++j)
{
scanf("%d", &C);
T[R].child.push_back(C);
}
}
DFS( T, 0, K, 0 );
sort( Ans.begin(), Ans.end(), cmp );
for(int i = 0; i != Ans.size(); ++i)
for(auto j = Ans[i].begin(); j != Ans[i].end(); ++j)
printf("%d%s", *j, j + 1 == Ans[i].end() ? "\n":" ");
}