考查点:DFS
思路:本题要求的是多条符合条件的路径且要字典序逆序输出,首先要输出符合条件的路径可以用DFS,关键技巧是在DFS增加一个参数numnode表示路径中的节点数,其次多个路径要逆序输出只须输入时预处理即可,即把子节点按权值从大到小排序
#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#define FOR(i, x, y) for(int i = x; i < y; i++)
#define rFOR(i, x, y) for(int i = x; i > = y; i--)
#define MAXN 110
#define oo 0x3f3f3f3f
using namespace std;
struct node{
int w;
vector<int> child;
}Node[MAXN];
int path[MAXN];
int h[MAXN];
int s,n,m;
void DFS(int index,int numNode,int sum){
if(sum>s)return;
if(sum==s){
if(Node[index].child.size()!=0) return;
FOR(i,0,numNode)
{
printf("%d",Node[path[i]].w);
if(i<numNode-1) printf(" ");
else printf("\n");
}
return ;
}
FOR(i,0,Node[index].child.size())
{
int id=Node[index].child[i];
path[numNode]=id;
DFS(id,numNode+1,sum+Node[id].w);
}
}
bool cmp(int a,int b)
{
return Node[a].w>Node[b].w;
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif // LOCAL
scanf("%d%d%d",&n,&m,&s);
FOR(i,0,n)
{
scanf("%d",&Node[i].w);
}
FOR(i,0,m)
{
int id,k;
scanf("%d%d",&id,&k);
FOR(j,0,k)
{
int x;
scanf("%d",&x);
Node[id].child.push_back(x);
}
sort(Node[id].child.begin(),Node[id].child.end(),cmp);
}
path[0]=0;
DFS(0,1,Node[0].w);
return 0;
}